Students should clone the repository from GitHub and then work through Line 300 of this R Notebook before our Digital Lab on March 8th.

Completing exercises will require running code to get output, and then adapting code or writing new code, and running it to be sure it gives appropriate output. As appropriate, add incude hash-tagged comment lines within chunks of code, and/or add descriptive, explanatory or interpretative notes about output.

During the March 8th session, we’ll quickly review mini-exercises. There are five of them, four in the first part. During the session on Friday, we will then delve into later portions of this notebook. It’s useful that you’ve reated (and have handy) one more more of the lists created for submission with Portfolio 2, because they’re used for later exercises and completing Portfolio 3. There’s also a fifth and final mini-exercise toward the end of the notebook.

To add new commands that can be run and also saved to re-run or modify later: click the Insert Chunk button on the above toolbar or press Ctrl+Alt+I. It’s also possible to directly keyboard this with a total of six keystrokes at the top ({r}) three at the bottom (). It’s also possible to highlight a chunk or certain lines in a chck, and to copy-paste elsewhere in the R Notebook document.

ACKNOWLEDGEMENTS

What’s below is compiled from or inspired by multiple sources. Material created by Nicholas Matzke and Dan Warren has been used at workshops at NIMBios. References: Matzke, Nicholas J.; Warren, Dan (2016). “Introduction to R, starting from scratch.” Free to use/redistribute under: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0) This program is free software; you can redistribute it and/or modify it under the terms of the above license, linked here: http://creativecommons.org/licenses/by-nc-sa/3.0/

Other useful resources:

https://ropensci.org/tutorials/

http://phylodiversity.net/phylomatic/

https://github.com/ropensci/brranching

HOMEWORK TO PREPARE FOR DIGITAL LAB 3

As usual, a first step upon opening R Studio is to load the appropriate packages using the command “library”. If you have never previously installed the package, you must do that first.

Often you are downloading packages from what’s called a “CRAN Repository” with CRAN standing for “Comprehensive R Archive Network”.

It is also possible to download R Packages from GitHub repositories if you have a package called “devtools” installed in R Studio. That’s how we are downloading the package called “brranching” which is part of a project known as R Open Science (https://ropensci.org/)

#install.packages(ape)
#install.packages("devtools")
#devtools::install_github("ropensci/brranching")
library("ape")
#library("brranching")

Phylogenies

In introductory biology, you should have been introduced to phylogenies – why they are important, the meaning of their graphical formatting, perhaps how they are inferred from raw data (in an associated character matrix).

Having discussed that briefly during Wednesday’s class, we’re going to review and work with an intuitive, easy, and widespread ways to summarize phylogenetic relationships: Newick code.

The text in green below is what a simple Newick string variable looks like. (It is a string variable, synonymous with character variable.) Notice the semi-colon at the end, outside of the last closing parenthesis. It is initially just being created as a character variable. Then it is identified as a phylogeny (“read as a tree”) using the command “read.tree” which is part of the R Package APE. Then it can be plotted to generate a graphical depiction of the phylogeny.

More on Newick format, which, annoyingly, is sometimes inconsistent: http://en.wikipedia.org/wiki/Newick_format

newick_str = "(((Humans, Chimps), Gorillas), Orangs);"
#Here, we are defining a character variable. 
tr_primates = read.tree(text=newick_str)
#Now, with the command "read.tree" from the Package APE, we are converting that simple character variable by reading it as a tree, also known as a phylo object. The function in APE is going to understand not only that there are four "tip taxa" but also that the structure of the parenthesis is meaningful as a hypothesis about their evolutionary relationship, and at the same time the information needed to connect them into a tree diagram with three nodes (which are ancestral taxa to these tip taxa). Before you run the code, think about what the phylogenetic tree should look like, basedo n what you know about these four taxa and about what you know about the code. 
plot(tr_primates)

#This last line simply plotted the object as a tree. More about this below. 

You may remember that during Digital Lab 1 on February 1st, we used the function “plot” to make an X-Y plot.

Why can we use it here to plot a phylogeny?

It’s because the data class of “tr_primates” is stored in the file structure of the R Environment as a tree, a list of at least three things: tips, nodes, and edges. This special type of data object is typically called a “phylo object”.

If you look in the R Studio windo at the upper right, you should see in the “Environment” tab that one thing on your list is tr_primate. You can find out more about it by clicking, and it will open in a new tab.

Here’s a way to access the help menu for some documentation about what these commands are for. Look for the documentation to appear in the lower left-hand window of R Studio.

?plot

What is the difference between regular plot and the command below, if any?

?plot.phylo

MINI EXERCISE 1: Understanding Newick and Phylo Objects

As an alternative to using the R Studio window at top right, instead write and submit a few commands such as

tr_primates

str(“tr_primates”)

and

str(tr_primates)

attributes(tr_primates)

names(tr_primates)

Generate output, and then write brief notes about the information you are given by submitting these commands.

There are many trees that can be drawn to show relationships of four taxa. Some have the same topology and simply re-arrange the placement of taxa on the tips. Others differ in the topology that connects tips to internal nodes. Among the many possibilities, many are inconsistent or non-parsimonious with respect to available data used for inferring phylogenies. Typically fewer will be consistent and parsimoneous, sometimes one will be uniquely best to fit the data.

To finish up Mini-Exercise 1, write new code with a new Newick string variable, read the string using read.tree, and plot it. The goal is to generate a four-taxon tree with a new topology. It will be an erroneous tree, depicting relationships that contradict today’s biological knowledge. That’s okay; this is just an exercise.

tr_primates

Phylogenetic tree with 4 tips and 3 internal nodes.

Tip labels:
[1] "Humans"   "Chimps"   "Gorillas" "Orangs"  

Rooted; no branch lengths.
str("tr_primates")
 chr "tr_primates"
str(tr_primates)
List of 3
 $ edge     : int [1:6, 1:2] 5 6 7 7 6 5 6 7 1 2 ...
 $ Nnode    : int 3
 $ tip.label: chr [1:4] "Humans" "Chimps" "Gorillas" "Orangs"
 - attr(*, "class")= chr "phylo"
 - attr(*, "order")= chr "cladewise"
attributes(tr_primates)
$names
[1] "edge"      "Nnode"     "tip.label"

$class
[1] "phylo"

$order
[1] "cladewise"
names(tr_primates) 
[1] "edge"      "Nnode"     "tip.label"
mynewick_str = "(((oaks,beech), magnolia), redwood);"
#Here, we are defining a character variable. 
tr_trees = read.tree(text=mynewick_str)
#Now, with the command "read.tree" from the Package APE, we are converting that simple character variable by reading it as a tree, also known as a phylo object. The function in APE is going to understand not only that there are four "tip taxa" but also that the structure of the parenthesis is meaningful as a hypothesis about their evolutionary relationship, and at the same time the information needed to connect them into a tree diagram with three nodes (which are ancestral taxa to these tip taxa). Before you run the code, think about what the phylogenetic tree should look like, basedo n what you know about these four taxa and about what you know about the code. 
plot(tr_trees)

#This last line simply plotted the object as a tree. More about this below. 

Overall message about phylogenies

Phylogenies have tips, nodes and edges. Nodes are ancestors to tips. Tips and edges are connected by nodes. Also, reecent or derived nodes can connect to older or ancestral nodesThe details of how tips and nodes connect (via edges) is dictate by the newick code.

This is technical but basic jargon. What is complex and rich is the biological and evolutionary meaning in this framework, important for understanding conservation, ethnobotany, ecology, conservation, ethnobotany or crop breeding, and evolutionary processes such as migration, hybridization, speciation or extinction.

If your knowledge or recall of phylogenies and associated vocabulary are limited, here is a handy glossary resource: http://pages.stat.wisc.edu/~larget/Genetics629/outline1.pdf

Tip and Node Structure in Phylogenies Imply a Hypothesis: Simple Botanical Examples

The chunk below has repeated these commands, but for plant taxa.

Before you run the code, can you tell from the Newick code if the phylogeny is botanically correct? Or is it erroneous? Confused? Recall from class on Wed 3/6 that Newick format is based on groupings, with taxa that are more related closer together than taxa that are less related. Also recall what you learned from introductory biology in high school or biology about about monophyletic groups such as the Monocots and Eudicots.

newick_str = "(((Cabbage, Corn), Kale), Wheat);"
tr_plants = read.tree(text=newick_str)
plot(tr_plants)

If it was hard to see relationships in the NewicK format, is it easier in this plotted tree format? Here are more resources if you feel like you need more help to review plant diversity or phylogenetics.

https://www.ebi.ac.uk/training/online/course/introduction-phylogenetics https://en.wikipedia.org/wiki/APG_IV_system

Is the phylogeny below better for these four taxa? and why or why not? (Can you tell directly from the Newick)?

newick_str = "(Wheat,(Corn,(Cabbage, Kale)));"
tr2_plants = read.tree(text=newick_str)
plot(tr2_plants)

MINI-EXERCISE 2

  1. Copy, paste and re-write a chunk of code (or write it fresh): write a new Newick tree as as string variable, read it as a tree, and plot it. Make sure it is consistent with 2018 botanical knowledge about these four taxa. You may need to modify topology.
cereals = "(((barley,wheat),rice),(maize,shorgum));"
tr2_cereals = read.tree(text=cereals)
plot(tr2_cereals)

  1. To these four taxa, add two additional taxa: radish and sequoia. For these six tip taxa, write a new Newick variable, read it, and plot it. Then repeat. Aim to write two alternative trees: one erroneous and one correct.
cerealsplus2wrong = "((((barley,radish,wheat),rice),(maize,shorgum)),sequoia);"
tr2_cerealsplus2wrong = read.tree(text=cerealsplus2wrong);
plot(tr2_cerealsplus2wrong);

cerealsplus2right = "(((((barley,wheat),rice),(maize,shorgum)),radish),sequoia);"
tr2_cerealsplus2right = read.tree(text=cerealsplus2right);
plot(tr2_cerealsplus2right);

  1. Explain what’s wrong in your erroneous tree and how you’ve corrected the error in the other tree. .
  2. Use commands such as “str” or “attribute” and comment about whether your erroneous and correct tree differ in tips, Nnodes, or edges.
tr2_cerealsplus2right

Phylogenetic tree with 7 tips and 6 internal nodes.

Tip labels:
    barley, wheat, rice, maize, shorgum, radish, ...

Rooted; no branch lengths.
str(tr2_cerealsplus2right)
List of 3
 $ edge     : int [1:12, 1:2] 8 9 10 11 12 12 11 10 13 13 ...
 $ Nnode    : int 6
 $ tip.label: chr [1:7] "barley" "wheat" "rice" "maize" ...
 - attr(*, "class")= chr "phylo"
 - attr(*, "order")= chr "cladewise"
attributes(tr2_cerealsplus2right)
$names
[1] "edge"      "Nnode"     "tip.label"

$class
[1] "phylo"

$order
[1] "cladewise"
names(tr2_cerealsplus2right) 
[1] "edge"      "Nnode"     "tip.label"

Branching order and branching lengths

Returning to the original tree, What was added to the tree and the plot of the tree?

newick_str = "(((Humans:12.5, Chimps:12.5):1.0, Gorillas:14.0):1.0, Orangs:14.5):1.0;"
tr_primate = read.tree(text=newick_str)
plot(tr_primate)

What was added to the tree and the plot of the tree?

newick_str = "(((Humans:6.0, Chimps:6.0)LCA_humans_chimps:1.0, Gorillas:7.0)LCA_w_gorillas:1.0, Orangs:8.0)LCA_w_orangs:1.0;"
tr_primate = read.tree(text=newick_str)
plot(tr_primate, show.node.label=TRUE)

attributes(tr_primate)
$names
[1] "edge"        "edge.length" "Nnode"       "node.label"  "tip.label"  
[6] "root.edge"  

$class
[1] "phylo"

$order
[1] "cladewise"
tr_primate

Phylogenetic tree with 4 tips and 3 internal nodes.

Tip labels:
[1] "Humans"   "Chimps"   "Gorillas" "Orangs"  
Node labels:
[1] "LCA_w_orangs"      "LCA_w_gorillas"    "LCA_humans_chimps"

Rooted; includes branch lengths.

MINI-EXERCISE 3

In November 2017, scientists discovered that there are two Orang species, the known species Pongo abelii and the new species Pongo tapanuliensis. The two taxa are estimated to have separated about 3.5 million years ago. How would you modify the Newick portion of code above to show that there are two species?

newick_str = "(((Humans:12.5, Chimps:12.5):1.0, Gorillas:14.0):1.0, Orangs:14.5):1.0;"
tr_primate = read.tree(text=newick_str)
plot(tr_primate)

Displaying Phylogenies

Now let’s examine some of the types of trees that can be displayed, starting with the default.

plot(tr_primate, type="phylogram")

plot(tr2_plants, type="phylogram", direction="rightwards")

plot(tr2_plants, type="phylogram", direction="leftwards")

plot(tr2_plants, type="phylogram", direction="upwards")

plot(tr2_plants, type="phylogram", direction="downwards")

plot(tr2_plants, type="cladogram")

plot(tr2_plants, type="fan")

plot(tr2_plants, type="unrooted")

plot(tr2_plants, type="radial")

Here’s something handy - put four plots in one output, using the command in the first line below:

layout(matrix(1:4, 2, 2))
plot(tr2_plants, type="cladogram")
plot(tr2_plants, type="fan")
plot(tr2_plants, type="unrooted")
plot(tr2_plants, type="radial")

You can also change the thickness of an edge, its color, how its tip labels are oriented.

layout(matrix(1:4, 2, 2))
plot(tr2_plants, type="unrooted", edge.width=5)
plot(tr2_plants, type="unrooted", edge.width=5, edge.color="blue")
plot(tr2_plants, type="unrooted", edge.width=5, edge.color="blue", lab4ut="horizontal")
plot(tr2_plants, type="unrooted", edge.width=5, edge.color="blue", lab4ut="axial")

Sometimes you might want to adjust the order that taxa appear along the tip labels. Note that we are not changing the underlying phylo-object, or anything about relationships by doing this.

# rotate clades containing nodes 3 and 4:
trnew_plants <- rotate(tr2_plants, c("Cabbage", "Kale"))
plot(trnew_plants)
# compare the results:
par(mfrow=c(1,2)) # split graphical device

plot(tr2_plants) # plot old tre
plot(trnew_plants) # plot new tree

Sometimes you want to re-arrange the clades on a tree, which can be done with the function ladderize, which in “right” ladderizing puts the smallest clades at the top (or at the left) and in “left” laderizing puts the largest clades at the top (or at the right).

layout(matrix(1:4, 2, 2))
plot(tr_primate, main = "normal")
plot(ladderize(tr_primate), main = "right-ladderized")
plot(ladderize(tr_primate, FALSE), main = "left-ladderized")
layout(matrix(1, 1))

The code below shows you can ladderize (and what ladderizing is - arranging sub-clades in order of size, which size referring to the number of taxa in the sub-clade)

layout(matrix(1:4, 2, 2))
plot(tr_primate, main = "normal", type = "phylogram", direction = c("upwards"))
plot(ladderize(tr_primate), main = "right-ladderized", direction = c("upwards"))
plot(ladderize(tr_primate, FALSE), main = "left-ladderized", direction=c("upwards"))
layout(matrix(1, 1))

MINI EXERCISE 4

Practice a few of these data display techniques using the six-taxon phylogeny that includes cabbage, kale, corn and wheat, plus radish and sequoia.

plot(tr2_cerealsplus2right);

layout(matrix(1:4, 2, 2))
plot(tr2_cerealsplus2right, type="cladogram")
plot(tr2_cerealsplus2right, type="fan")
plot(tr2_cerealsplus2right, type="unrooted")
plot(tr2_cerealsplus2right, type="radial")

layout(matrix(1:4, 2, 2))
plot(tr2_cerealsplus2right, type="unrooted", edge.width=5, edge.color="blue")
plot(tr2_cerealsplus2right, type="unrooted", edge.width=5, edge.color="red", lab4ut="horizontal")
plot(tr2_cerealsplus2right, type="unrooted", edge.width=5, edge.color="green", lab4ut="axial")

layout(matrix(1:4, 2, 2))
plot(tr2_cerealsplus2right, main = "normal", type = "phylogram", direction = c("upwards"))
plot(ladderize(tr2_cerealsplus2right), main = "right-ladderized", direction = c("upwards"))
plot(ladderize(tr2_cerealsplus2right, FALSE), main = "left-ladderized", direction=c("upwards"))

SAVING FILES: important for reproducing trees later

As part of Portfolio 3, we’ll learn ways outside of R to work with trees to visually change things like tip labels, color coding, etc. (There are also packages in R to do this, e.g. GGTREE.)

For this, you’ll want to be able to save the Newick code for any tree typed in (or imported in from database sources using R tools). Here is how to save a long Newick as a named text file. That makes it easier to later re-import the exact tree.

This will store the new file in your working directory. You may want to then make a copy of it and store it elsewhere, too. (You can do that outside of R Studio, or using Files in the lower right windowframe.)

newick_fn = "tr2_plants"
write.tree(tr2_plants, file=tr2_plants)
the condition has length > 1 and only the first element will be usedError in cat(res, file = file, append = append, sep = "\n") : 
  invalid connection
#If you want to make sure it is in your directory, first figure out your working directory
getwd()
[1] "/Users/txismis/Documents/GitHub/portfolio-3-maiteibanez"
#Then you can look at the window at lower right, and click to the correct director to find your saved file.

By the way, can save any displayed tree to PDF, or do a screen capture etc. you can also save a tree to PDF as shown below.

pdf_fn = "tr2_plants.pdf"
pdf(file=pdf_fn)
plot(tr2_plants, type="unrooted", edge.width=5, edge.color="blue", lab4ut="axial")
dev.off()
null device 
          1 

In Macs (and maybe PCs), this will open the PDF from R:

cmdstr = paste("open ", pdf_fn, sep="")
system(cmdstr)
library(ape)
#Here is the phylogeny from lecture on Wed
newick_lecture = "(((((A,B),(C,D)),(((E,F),G))),(H)),((((I,J),K),(L,M)),((N,0),(P,Q))));"
tr_lectureFULL = read.tree(text=newick_lecture)
plot(tr_lectureFULL, type="cladogram", direction=c("upwards"))

#In lecture on Wed, we also looked at subclades within this larger phylogeny
newick_lecture1 = "((((E,F),G)),H);"
tr_lectureSUB1 = read.tree(text=newick_lecture1)
plot(tr_lectureSUB1, type="cladogram", direction=c("upwards"))

newick_lecture2 = "(((I,J),K),(L,M));"
tr_lectureSUB2 = read.tree(text=newick_lecture2)
plot(tr_lectureSUB2, type="cladogram", direction=c("upwards"))

THIS IS MATERIAL FOR OUR DIGITAL LAB SESSION ON FRIDAY MARCH 8

TURNING LISTS OF PLANT TAXA INTO PHYLOGENIES: PHYLOMATIC (Package BRRANCHING)

Above, we used a simple tree and relied on our own working knowledge to determine the Newick string and the correct branching sequence for our taxa.

Many scientists in the field of systematics are involved in creating new and more expansive character matrices filled with copious DNA data or morphological data, and many more than 4 or 5 taxa. We are not going to delve into the protocols for amassing and manipulating such data, or for infer and compiling phylogenies from those data.

Indeed, given how much is already known about phylogenies, that is not always necessary in many studies of biodiversity asking questions relevant to biogeography, conservation, ethnobotany or macroecology.

But we definitely will want to work with many more than 4 or 5 taxa. We want to start working up to trees with dozens of taxa, possibly more.

This week, we’ll look at one tool to obtain input for a list of taxa, as either a plotted tree or a Newick tree. The base reference to this is a tree known as the “Phylomatic tree” and there is basically just one key step – querying Phylomatic.

Phylomatic has the tagline “I can haz all the phylogenies” and can deal with really large trees with hundreds of families and thousands of genera.

Here, we are just going to input a list of plants as a vector of string variables. We are just entering a list, and do not need to worry about setting up the Newick format with parentheses showing the nestedness and relationships among the species. It is critically important that these be correctly spelled with proper species binomial names. (This is reminiscent of the “scrubbed species binomials” that were used in the BIEN database and R BIEN package.)

#If you did not already load the Package brranching, be sure to do so now. You may need to also install it. 
#install.packages(ape)
#install.packages("devtools")
#devtools::install_github("ropensci/brranching")
#library("ape")
library("brranching")
taxa<-c("Punica granatum", "Theobroma cacao", "Dorstenia contrajerva", "Neomarica northiana", "Zamia floridana", "Aechmea fasciata", "Solandra maxima", "Grevillea robusta", "Jasminum polyanthum", "Tibouchina urvilleana", "Amorphophallus konjac", "Saccharum officinarum")
taxa
 [1] "Punica granatum"       "Theobroma cacao"       "Dorstenia contrajerva"
 [4] "Neomarica northiana"   "Zamia floridana"       "Aechmea fasciata"     
 [7] "Solandra maxima"       "Grevillea robusta"     "Jasminum polyanthum"  
[10] "Tibouchina urvilleana" "Amorphophallus konjac" "Saccharum officinarum"

For the ten species above, a tree can be extracted from phylomatic, and plotted.

During lab, I’ll explain to you about the reference data and procedures being used to do this:

tree_phylomatic <- phylomatic(taxa = taxa, storedtree ="R20120829", get = 'POST')
plot(tree_phylomatic, no.margin = TRUE)

We can also write the tree into a text file, in newick format:

newick_fn = "tree_phylomatic"
write.tree(tree_phylomatic, file=newick_fn)
#Go and verify that there is now a file in your working directory. Make sure you also know how to open it in another program like a workbook file. You also can copy it onto the clipboard of the computer. 

Let’s try obtaining another tree using the phylomatic function (which is in the brranching package; see the top of the notebook).

From our earlier work in R BIEN, we had a list of ten breadfruit relatives, in the genus Artocarpus

[1] “Artocarpus anisophyllus” “Artocarpus dadah” “Artocarpus fulvicortex” [4] “Artocarpus hirsutus” “Artocarpus integer” “Artocarpus lowii”
[7] “Artocarpus maingayi” “Artocarpus nitidus” “Artocarpus rigidus”
[10] “Artocarpus scortechinii”

Arto<-c("Artocarpus anisophyllus","Artocarpus dadah","Artocarpus fulvicortex","Artocarpus hirsutus","Artocarpus integer","Artocarpus lowii","Artocarpus maingayi","Artocarpus nitidus","Artocarpus rigidus","Artocarpus scortechinii")
taxa
 [1] "Punica granatum"       "Theobroma cacao"       "Dorstenia contrajerva"
 [4] "Neomarica northiana"   "Zamia floridana"       "Aechmea fasciata"     
 [7] "Solandra maxima"       "Grevillea robusta"     "Jasminum polyanthum"  
[10] "Tibouchina urvilleana" "Amorphophallus konjac" "Saccharum officinarum"
tree_phylomatic_Arto <- phylomatic(taxa = Arto, get = 'POST')
plot(tree_phylomatic_Arto, no.margin = TRUE)

newick_fn2 = "tree_phylomatic_Arto"
write.tree(tree_phylomatic_Arto, file=newick_fn2)

What is going on here? Where else might we look for a proper tree? Below, we’ll explore the DRYAD Database, but also check out this publication: https://doi.org/10.1093/aob/mcw249

Phylomatic is part of R-Open-Sci and it has the tagline “I can haz all the phylogenies” and can deal with really large trees with hundreds of families and thousands of genera, but it is not necessarily going to perform well within a genus.

In DRYAD, there is a URL on the internet where the scientists have stored a raw-text file with the Newick code that includes details within the conifers, including the genus Abies. WHAT IS THE PUBLICATION This tree also has a lot of other data that is useful for angiosperms. Take a look at it here: http://datadryad.org/bitstream/handle/10255/dryad.8791/final_tree.tre?sequence=1

spp1 <- c("Abies_nordmanniana", "Abies_bornmuelleriana", "Abies_cilicica", "Abies_cephalonica",
"Abies_numidica", "Abies_pinsapo", "Abies_alba", "Ginkgo biloba", "Nymphaea lotus", "Illicium mexicanum", "Magnolia fraseri","Lindera pulcherrima")
urlA<-"http://datadryad.org/bitstream/handle/10255/dryad.8791/final_tree.tre?sequence=1"
#We are making a "short-cut" variable that is just the URL for this tree. 
#Now we are going to use the function phylomatic, and instead of using one of the stored trees, we are going to use the tree at that URL.
Abies<-phylomatic(taxa=spp1, treeuri=urlA)
plot(Abies)

ADD ONE MORE WAY TO DO IT - WITH THE SLASHPATH METHOD

spp1 <- read.table("slashpath.txt")
#You can find this file in your working directory and look at how it is set up. 
#Note that it already assigns every species and/or genus to a family
#When you pass in species names or genus names, the phylomatic function automatically uses an R Package TAXIZE to look up and associate the taxon names with the family, and then to format the data to feed it into the phylomatic command this way. 
#Take a look at the output from the line immediately below to inspect the data and how its set up.
spp1
tree_phylomatic <- phylomatic(taxa = spp1)
#We have dropped the Get =POST command.
plot(tree_phylomatic, no.margin = TRUE)

A problem with this tree is that it does not include branch lengths.

For that, we can turn back to the other plant-specific stored tree in Phylomatic, known as “zanne2014”

tree_phylomatic <- phylomatic(taxa = spp1, storedtree ="zanne2014", get = 'POST')
NOTE: 1 taxa not matched: pinaceae/abies_bornmuelleriana/abies_bornmuelleriana, ];
plot(tree_phylomatic, no.margin = TRUE)

Here is another example of a tree with variable branch lengths.

spp1 <- c("Abies_nordmanniana", "Abies_bornmuelleriana", "Abies_cilicica", "Abies_cephalonica",
"Abies_numidica", "Abies_pinsapo", "Abies_alba", "Ginkgo biloba", "Nymphaea lotus", "Illicium mexicanum", "Magnolia fraseri","Lindera pulcherrima")
tree_phylomatic <- phylomatic(taxa = taxa, storedtree ="zanne2014", get = 'POST')
plot(tree_phylomatic, no.margin = TRUE)

Here’s an example of this type of data phylogenized: lists of species from Emily Gregory’s anatomy textbook.

EG<-c("Abies",
"Ailanthus",
"Aspicllum",
"Atragene",
"Bangia",
"Begonia",
"Berberis",
"Betula",
"Blasia",
"Blechnum",
"Caulerpa",
"Ceratophyllum",
"Chenopodium",
"Clematis",
"Cocculus",
"Corallorrhiza",
"Corchorus",
"Cucurbita",
"Dahlia",
"Dioscorea",
"Dracaena",
"Equisetum",
"Euonymus",
"Euphorbia",
"Fagus",
"Ficus",
"Fontinalis",
"Fossombronia",
"Fritillaria",
"Fucus",
"Gleditschia",
"Gleocapsa",
"Haplomitrium",
"Hedera",
"Helianthus",
"Heterocentron",
"Hippuris",
"Hypoderma",
"Isoetes",
"Linum",
"Liquidambar",
"Marchantia",
"Momordica",
"Monopodium",
"Mucor",
"Nerium",
"Nitella",
"Osmunda",
"Pandanus",
"Papaver",
"Pelargonium",
"Phlomis",
"Phytolacca",
"Pinus",
"Platanus",
"Polytrichum",
"Populus",
"Potamogeton",
"Punctum",
"Quercus",
"Ricinus",
"Rubus",
"Salix",
"Sambucus",
"Sclerotium",
"Selaginella",
"Sempervivum",
"Sponia",
"Stypocaulon",
"Sympodium",
"Taxodium",
"Tecoma",
"Tradescantia",
"Urtica",
"Viola",
"Vitis",
"Wisteria",
"Yucca")
#Now we are going to look at what we just created:
EG
 [1] "Abies"         "Ailanthus"     "Aspicllum"     "Atragene"      "Bangia"       
 [6] "Begonia"       "Berberis"      "Betula"        "Blasia"        "Blechnum"     
[11] "Caulerpa"      "Ceratophyllum" "Chenopodium"   "Clematis"      "Cocculus"     
[16] "Corallorrhiza" "Corchorus"     "Cucurbita"     "Dahlia"        "Dioscorea"    
[21] "Dracaena"      "Equisetum"     "Euonymus"      "Euphorbia"     "Fagus"        
[26] "Ficus"         "Fontinalis"    "Fossombronia"  "Fritillaria"   "Fucus"        
[31] "Gleditschia"   "Gleocapsa"     "Haplomitrium"  "Hedera"        "Helianthus"   
[36] "Heterocentron" "Hippuris"      "Hypoderma"     "Isoetes"       "Linum"        
[41] "Liquidambar"   "Marchantia"    "Momordica"     "Monopodium"    "Mucor"        
[46] "Nerium"        "Nitella"       "Osmunda"       "Pandanus"      "Papaver"      
[51] "Pelargonium"   "Phlomis"       "Phytolacca"    "Pinus"         "Platanus"     
[56] "Polytrichum"   "Populus"       "Potamogeton"   "Punctum"       "Quercus"      
[61] "Ricinus"       "Rubus"         "Salix"         "Sambucus"      "Sclerotium"   
[66] "Selaginella"   "Sempervivum"   "Sponia"        "Stypocaulon"   "Sympodium"    
[71] "Taxodium"      "Tecoma"        "Tradescantia"  "Urtica"        "Viola"        
[76] "Vitis"         "Wisteria"      "Yucca"        
#In this line, we've made the explicit argument to use the defaul R220150415 tree in phylomatic and then to also use the zanne2014 tree. 
#Note that including the argument get = "POST" we are asking the phylomatic function to connect our genus names to the appropriate family names, which is how phylomatic goes about aligning our list with the supertree phylogeny, and then to output a tree for our subset of taxa.
tree_phylomatic_EG1 <- phylomatic(taxa = EG, get = 'POST')
NOTE: 26 taxa not matched: NA/aspicllum/aspicllum, NA/bangia/bangia, NA/blasia/blasia, NA/blechnum/blechnum, NA/caulerpa/caulerpa, NA/corallorrhiza/corallorrhiza, NA/equisetum/equisetum, NA/fontinalis/fontinalis, NA/fossombronia/fossombronia, NA/fucus/fucus, NA/gleditschia/gleditschia, NA/gleocapsa/gleocapsa, NA/haplomitrium/haplomitrium, NA/hypoderma/hypoderma, NA/isoetes/isoetes, NA/marchantia/marchantia, NA/monopodium/monopodium, NA/mucor/mucor, NA/nitella/nitella, NA/osmunda/osmunda, NA/polytrichum/polytrichum, NA/punctum/punctum, NA/sclerotium/sclerotium, NA/selaginella/selaginella, NA/stypocaulon/stypocaulon, NA/sympodium/sympodium, ];
plot(tree_phylomatic_EG1, no.margin = TRUE, type="cladogram")

newick_fn4 = "tree_phylomatic_EG1"
write.tree(tree_phylomatic_EG1, file=newick_fn4)
#repeating to get tree from Zanne2014
tree_phylomatic_EG2 <- phylomatic(taxa = EG, storedtree ="zanne2014", get = 'POST')
NOTE: 30 taxa not matched: pinaceae/abies/abies, NA/aspicllum/aspicllum, NA/bangia/bangia, NA/blasia/blasia, NA/blechnum/blechnum, NA/caulerpa/caulerpa, ceratophyllaceae/ceratophyllum/ceratophyllum, NA/corallorrhiza/corallorrhiza, NA/equisetum/equisetum, NA/fontinalis/fontinalis, NA/fossombronia/fossombronia, NA/fucus/fucus, NA/gleditschia/gleditschia, NA/gleocapsa/gleocapsa, NA/haplomitrium/haplomitrium, NA/hypoderma/hypoderma, NA/isoetes/isoetes, NA/marchantia/marchantia, NA/monopodium/monopodium, NA/mucor/mucor, NA/nitella/nitella, NA/osmunda/osmunda, pinaceae/pinus/pinus, NA/polytrichum/polytrichum, NA/punctum/punctum, NA/sclerotium/sclerotium, NA/selaginella/selaginella, NA/stypocaulon/stypocaulon, NA/sympodium/sympodium, vitaceae/vitis/vitis, ];
plot(tree_phylomatic_EG2, no.margin = TRUE, type="cladogram")

newick_fn5 = "tree_phylomatic_EG2"
write.tree(tree_phylomatic_EG2, file=newick_fn5)

MINI-EXERCISE 5

Do and write up notes about two things:

  1. Try generating these trees again, but change from cladogram to phylogram, or to another format for the tree.
plot(tree_phylomatic_EG1, type="phylogram")

plot(tree_phylomatic_EG2, type="phylogram")

tree_phylomatic_EG1

Phylogenetic tree with 50 tips and 48 internal nodes.

Tip labels:
    taxodium, abies, pinus, tecoma, phlomis, hippuris, ...
Node labels:
    seedplants, pinales, pinaceae, poales_to_asterales, ceratophyllales_and_eudicots, eudicots, ...

Rooted; no branch lengths.
str(tree_phylomatic_EG1)
List of 5
 $ edge       : num [1:97, 1:2] 51 52 52 53 53 51 54 55 56 57 ...
 $ Nnode      : int 48
 $ tip.label  : chr [1:50] "taxodium" "abies" "pinus" "tecoma" ...
 $ edge.length: NULL
 $ node.label : chr [1:48] "seedplants" "pinales" "pinaceae" "poales_to_asterales" ...
 - attr(*, "class")= chr [1:2] "phylo" "phylomatic"
 - attr(*, "order")= chr "cladewise"
 - attr(*, "missing")= chr [1:26] "Aspicllum" "Bangia" "Blasia" "Blechnum" ...
attributes(tree_phylomatic_EG1)
$names
[1] "edge"        "Nnode"       "tip.label"   "edge.length" "node.label" 

$class
[1] "phylo"      "phylomatic"

$order
[1] "cladewise"

$missing
 [1] "Aspicllum"     "Bangia"        "Blasia"        "Blechnum"      "Caulerpa"     
 [6] "Corallorrhiza" "Equisetum"     "Fontinalis"    "Fossombronia"  "Fucus"        
[11] "Gleditschia"   "Gleocapsa"     "Haplomitrium"  "Hypoderma"     "Isoetes"      
[16] "Marchantia"    "Monopodium"    "Mucor"         "Nitella"       "Osmunda"      
[21] "Polytrichum"   "Punctum"       "Sclerotium"    "Selaginella"   "Stypocaulon"  
[26] "Sympodium"    
names(tree_phylomatic_EG1) 
[1] "edge"        "Nnode"       "tip.label"   "edge.length" "node.label" 
tree_phylomatic_EG2

Phylogenetic tree with 48 tips and 47 internal nodes.

Tip labels:
    taxodium, tecoma, phlomis, hippuris, nerium, hedera, ...
Node labels:
    Spermatophyta, , Eudicotyledoneae, Gunneridae, Pentapetalae, , ...

Rooted; includes branch lengths.
str(tree_phylomatic_EG2)
List of 5
 $ edge       : num [1:94, 1:2] 49 49 50 51 52 53 54 55 56 57 ...
 $ Nnode      : int 47
 $ tip.label  : chr [1:48] "taxodium" "tecoma" "phlomis" "hippuris" ...
 $ edge.length: num [1:94] 352.24 163.95 51.38 17.73 2.47 ...
 $ node.label : chr [1:47] "Spermatophyta" "" "Eudicotyledoneae" "Gunneridae" ...
 - attr(*, "class")= chr [1:2] "phylo" "phylomatic"
 - attr(*, "order")= chr "cladewise"
 - attr(*, "missing")= chr [1:30] "Abies" "Aspicllum" "Bangia" "Blasia" ...
attributes(tree_phylomatic_EG2)
$names
[1] "edge"        "Nnode"       "tip.label"   "edge.length" "node.label" 

$class
[1] "phylo"      "phylomatic"

$order
[1] "cladewise"

$missing
 [1] "Abies"         "Aspicllum"     "Bangia"        "Blasia"        "Blechnum"     
 [6] "Caulerpa"      "Ceratophyllum" "Corallorrhiza" "Equisetum"     "Fontinalis"   
[11] "Fossombronia"  "Fucus"         "Gleditschia"   "Gleocapsa"     "Haplomitrium" 
[16] "Hypoderma"     "Isoetes"       "Marchantia"    "Monopodium"    "Mucor"        
[21] "Nitella"       "Osmunda"       "Pinus"         "Polytrichum"   "Punctum"      
[26] "Sclerotium"    "Selaginella"   "Stypocaulon"   "Sympodium"     "Vitis"        
names(tree_phylomatic_EG2) 
[1] "edge"        "Nnode"       "tip.label"   "edge.length" "node.label" 
  1. Then, looking at all your output, what differs most noticably between the pair of trees, and how/why does this relate to the storedtree used to generate them? Try to explain what this means in your own words.

  2. Lastly, look at the output and you’ll see that many taxa were excluded. Try looking them up in EOL or Wikipedia. Why was it difficult to include them? What does this say about the history of botany? Are there some things that were excluded that should not have been excluded.

FINISHING UP - MICRO-EXERCISES AND A MACRO-EXERCISE

To finish up all the homework and work from today, you need to work through all the mini-exercises CORRECTLY. As appropriate, after our Digital Lab 3 session on 3/5, take time to go back and complete them (and add your commentary).

Next, you prepared lists for Portfolio 2. You can use these to finish up this workbook, as long as you have at least two lists of 25 taxa each.

Format the list so that you can enter it into the phyomatic commands above – probably by cutting and pasting a list of taxa. You may need to insert quotation marks and/or commas. I encourage you to try a diffrent way of doing this: prepare a file, save it as a *.txt file and then read it and use the file.

Your list/file can then be used to obtain a phylogenetic tree using the code learned above for Phylomatic.

Plot your tree in one or more formats (e.g., fan, phylogeny, cladogram). Save that in pdf format.

YOu were able to make those plots because phylomatic generated Newick trees, which you you need to save, too. Use *.txt format.

You can then use those output files to begin the part of the Portfolio that uses Interactive Tree of Life.

Lastly, be sure to save your R Notebook with appropriate output and commentary.

When your finished with this part of Portfolio 3, you can and should push the notebook and associated exported files back to the appropriate GitHub Repository for Digital Lab 3.

LES<-c("Acer rubrum", "Dichanthelium depauperatum", "Erigeron strigosus", "Eurybia divaricata", "Parthenocissus quinquefolia", "Prunus serotina", "Rubus allegheniensis", "Smilax rotundifolia", "Viburnum prunifolium", "Viola cucullata", "Acalypha virginica", "Pteridium aquilinum", "Castanea dentata", "Quercus rubra", "Rhus copallinum", "Spartina alterniflora", "Spartina patens", "Viburnum acerifolium", "Muhlenbergia schreberi", "Anemone virginiana", "Arabis laevigata", "Aralia nudicaulis", "Arisaema triphyllum", "Asclepias tuberosa", "Atriplex patula", "Aureolaria flava", "Carya glabra", "Celastrus scandens", "Cenchrus tribuloides", "Chimaphila maculata", "Cuscuta gronovii", "Dennstaedtia punctilobula", "Desmodium nudiflorum", "Desmodium rotundifolium", "Dryopteris marginalis", "Erechtites hieraciifolius", "Fragaria virginiana", "Galium circaezans", "Galium triflorum", "Gaylussacia baccata", "Geranium maculatum", "Geum virginianum", "Hamamelis virginiana", "Hieracium scabrum", "Iva frutescens", "Juniperus virginiana", "Kalmia latifolia", "Lactuca canadensis", "Lespedeza procumbens", "Limonium carolinianum", "Linum virginianum", "Lobelia inflata", "Lonicera sempervirens", "Maianthemum racemosum", "Mitchella repens", "Muhlenbergia sobolifera", "Panicum virgatum", "Phegopteris hexagonoptera", "Phryma leptostachya", "Physalis heterophylla", "Pinus rigida", "Plantago maritima", "Polygonum scandens", "Polystichum acrostichoides", "Potentilla norvegica", "Rosa carolina", "Sarcocornia perennis", "Saxifraga virginiensis", "Silene caroliniana", "Solidago caesia", "Solidago nemoralis", "Solidago sempervirens", "Triodanis perfoliata", "Vaccinium corymbosum", "Viola palmata", "Vitis labrusca", "Lespedeza hirta", "Euthamia graminifolia", "Hepatica nobilis", "Actaea pachypoda", "Cornus alternifolia", "Liriodendron Tulipifera", "Phragmites australis", "Pycnanthemum virginianum", "Rubus canadensis", "Quercus prinus", "Antennaria plantaginifolia", "Apocynum cannabinum", "Cirsium horridulum", "Cirsium pumilum", "Festuca rubra", "Hieracium paniculatum", "Oenothera biennis", "Schizachyrium scoparium", "Trichostema dichotomum", "Tridens flavus", "Athyrium filix-femina", "Clematis virginiana", "Polygala verticillata", "Populus tremuloides", "Solidago odora", "Acalypha gracilens", "Agalinis maritima", "Agalinis tenuifolia", "Agrostis hyemalis", "Agrostis perennans", "Arabis lyrata", "Bulbostylis capillaris", "Carex cephalophora", "Carex pensylvanica", "Carex umbellata", "Carya alba", "Chimaphila umbellata", "Cimicifuga racemosa", "Corylus americana", "Cypripedium acaule", "Desmodium glabellum", "Desmodium marilandicum", "Desmodium paniculatum", "Distichlis spicata", "Eleocharis parvula", "Equisetum arvense", "Eupatorium rotundifolium", "Hibiscus moscheutos", "Hieracium venosum", "Iris versicolor", "Juncus gerardii", "Lechea mucronata", "Lespedeza violacea", "Morella pensylvanica", "Nyssa sylvatica", "Panicum capillare", "Pedicularis canadensis", "Photinia melanocarpa", "Potentilla canadensis", "Potentilla simplex", "Pycnanthemum tenuifolium", "Pyrola americana", "Quercus alba", "Quercus coccinea", "Quercus velutina", "Ranunculus abortivus", "Ranunculus recurvatus", "Rubus hispidus", "Rubus occidentalis", "Rubus pensilvanicus", "Schoenoplectus americanus", "Sericocarpus asteroides", "Solidago bicolor", "Solidago canadensis", "Triglochin maritimum", "Vaccinium pallidum", "Vernonia noveboracensis", "Vitis aestivalis", "Lycopodium complanatum", "Myosotis verna", "Pyrola elliptica", "Silene stellata", "Verbena urticifolia", "Allium canadense", "Ceanothus americanus", "Hypoxis hirsuta", "Lespedeza capitata", "Sphenopholis obtusata", "Asclepias purpurascens", "Baccharis halimifolia", "Carpinus caroliniana", "Celtis occidentalis", "Chamaesyce nutans", "Clethra alnifolia", "Cornus racemosa", "Dryopteris intermedia", "Liquidambar styraciflua", "Rosa virginiana", "Vitis riparia", "Apios americana", "Lactuca biennis", "Ambrosia artemisiifolia", "Danthonia spicata", "Ionactis linariifolius", "Juncus tenuis", "Teucrium canadense", "Eurybia macrophylla", "Maiantemum canadense", "Viola sororia", "Bidens frondosa", "Oxalis stricta", "Persicaria pensylvanica", "Thalictrum dioicum", "Toxicodendron radicans", "Amelanchier arborea", "Amelanchier laevis", "Anaphalis margaritacea", "Apocynum androsaemifolium", "Arabis canadensis", "Asplenium platyneuron", "Asplenium trichomanes", "Aureolaria virginica", "Betula nigra", "Cardamine parviflora", "Carex hitchcockiana", "Carya cordiformis", "Cornus rugosa", "Cyperus lupulinus", "Diervilla lonicera", "Diospyros virginiana", "Erigeron philadelphicus", "Helianthus divaricatus", "Juglans nigra", "Lechea racemulosa", "Malus coronaria", "Oxalis violacea", "Physalis virginiana", "Prenanthes altissima", "Pycnanthemum clinopodioides", "Ribes americanum", "Sericocarpus linifolius", "Solidago flexicaulis", "Symphyotrichum lanceolatum", "Symphyotrichum lowrieanum", "Vaccinium angustifolium", "Verbena simplex", "Aquilegia canadensis", "Aralia racemosa", "Aristida longispica", "Bidens connata", "Boehmeria cylindrica", "Carex eburnea", "Carex muehlenbergii", "Claytonia virginica", "Conopholis americana", "Cyperus odoratus", "Desmodium canadense", "Dicentra cucullaria", "Dichanthelium clandestinum", "Elymus hystrix", "Erythronium americanum", "Eupatorium fistulosum", "Eupatorium hyssopifolium", "Eupatorium purpureum", "Galium lanceolatum", "Gentianopsis crinita", "Leersia virginica", "Lilaeopsis chinensis", "Lycopus uniflorus", "Lysimachia hybrida", "Monotropa hypopithys", "Oenothera parviflora", "Opuntia humifusa", "Orobanche uniflora", "Osmunda regalis", "Panax quinquefolius", "Symphyotrichum novae-angliae", "Thelypteris noveboracensis", "Viburnum dentatum", "Viola sagittata", "Bromus pubescens", "Deparia acrostichoides", "Fagus grandifolia", "Fraxinus americana", "Juglans cinerea", "Laportea canadensis", "Lindera benzoin", "Polygala sanguinea", "Polygonum erectum", "Populus deltoides", "Ranunculus pensylvanicus", "Salix humilis", "Spiranthes lacera", "Thalictrum thalictroides", "Trichophorum planifolium", "Trillium cernuum", "Ulmus americana", "Viola pedata", "Aletris farinosa", "Anemone quinquefolia", "Arabis glabra", "Betula lenta", "Carex albicans", "Carex platyphylla", "Circaea lutetiana", "Cuphea viscosissima", "Danthonia compressa", "Deschampsia flexuosa", "Desmodium canescens", "Desmodium laevigatum", "Desmodium nuttallii", "Goodyera pubescens", "Hieracium gronovii", "Juncus acuminatus", "Juncus marginatus", "Lycopodium digitatum", "Ophioglossum pusillum", "Parietaria pensylvanica", "Pluchea odorata", "Polygala incarnata", "Polygonum ramosissimum", "Pseudognaphalium obtusifolium", "Pycnanthemum torrei", "Sabatia dodecandra", "Salicornia virginica", "Solidago speciosa", "Spartina cynosuroides", "Sphenopholis nitida", "Symphyotrichum racemosum", "Triosteum perfoliatum", "Veronicastrum virginicum", "Anemone cylindrica", "Antennaria neglecta", "Botrychium virginianum", "Calystegia spithamaea", "Cenchrus longispinus", "Chamaecrista fasciculata", "Chamaecrista nictitans", "Comptonia peregrina", "Leucothoe racemosa", "Liatris scariosa", "Lycopodium obscurum", "Lycopus virginicus", "Lysimachia ciliata", "Lysimachia quadrifolia", "Oligoneuron rigidum", "Panax trifolius", "Phaseolus polystachios", "Polygonatum biflorum", "Sporobolus compositus", "Symphyotrichum ericoides", "Uvularia sessilifolia", "Vulpia octoflora", "Agrimonia gryposepala", "Ambrosia trifida", "Asplenium rhizophyllum", "Bartonia virginica", "Carya ovalis", "Corallorrhiza maculata", "Corallorrhiza odontorhiza", "Corydalis sempervirens", "Desmodium obtusum", "Eragrostis capillaris", "Onoclea sensibilis", "Osmunda claytoniana", "Ptelea trifoliata", "Rubus odoratus", "Salix sericea", "Scrophularia lanceolata", "Scrophularia marilandica", "Thaspium trifoliatum", "Woodsia obtusa", "Agastache nepetoides", "Asclepias verticillata", "Bromus ciliatus", "Cardamine diphylla", "Crataegus pedicellata", "Elymus canadensis", "Galearis spectabilis", "Pellaea atropurpurea", "Prunus pensylvanica", "Tsuga canadensis", "Ulmus rubra", "Acer saccharinum", "Acer saccharum", "Andropogon glomeratus", "Andropogon virginicus", "Carya ovata", "Chenopodium simplex", "Collinsonia canadensis", "Crataegus crus-galli", "Cystopteris fragilis", "Dichanthelium scoparium", "Dioscorea villosa", "Elymus virginicus", "Gaylussacia frondosa", "Helianthus decapetalus", "Hierochloe odorata", "Hydrophyllum canadense", "Lathyrus palustris", "Lilium philadelphicum", "Liparis liliifolia", "Lyonia mariana", "Lysimachia thyrsiflora", "Medeola virginiana", "Ostrya virginiana", "Oxalis montana", "Podophyllum peltatum", "Populus grandidentata", "Pycnanthemum incanum", "Pycnanthemum muticum", "Quercus prinoides", "Quercus stellata", "Sabatia campanulata", "Salvia lyrata", "Sanguinaria canadensis", "Sicyos angulatus", "Silene antirrhina", "Smilax herbacea", "Symphyotrichum cordifolium", "Symphyotrichum novi-belgii", "Tilia americana", "Trillium erectum", "Uvularia perfoliata", "Viburnum lantanoides", "Agalinis purpurea", "Alisma triviale", "Botrychium dissectum", "Cardamine concatenata", "Cinna arundinacea", "Commelina erecta", "Crotalaria sagittalis", "Echinocystis lobata", "Epifagus virginiana", "Euthamia tenuifolia", "Fraxinus pennsylvanica", "Gaultheria procumbens", "Gentiana andrewsii", "Lonicera dioica", "Matteuccia struthiopteris", "Monotropa uniflora", "Oclemena acuminata", "Onosmodium virginianum", "Phegopteris connectilis", "Polygonatum pubescens", "Polygonum tenue", "Rubus cuneifolius", "Smilax glauca", "Staphylea trifolia", "Woodwardia virginica", "Caulophyllum thalictroides", "Chamaelirium luteum", "Crataegus pruinosa", "Cyperus squarrosus", "Dryopteris carthusiana", "Euonymus americana", "Galactia volubilis", "Liparis loeselii", "Menispermum canadense", "Polypodium virginianum", "Scleria triglomerata", "Scutellaria elliptica", "Stachys tenuifolia", "Woodsia ilvensis")
Error: Incomplete expression: LES<-c("Acer rubrum", "Dichanthelium depauperatum", "Erigeron strigosus", "Eurybia divaricata", "Parthenocissus quinquefolia", "Prunus serotina", "Rubus allegheniensis", "Smilax rotundifolia", "Viburnum prunifolium", "Viola cucullata", "Acalypha virginica", "Pteridium aquilinum", "Castanea dentata", "Quercus rubra", "Rhus copallinum", "Spartina alterniflora", "Spartina patens", "Viburnum acerifolium", "Muhlenbergia schreberi", "Anemone virginiana", "Arabis laevigata", "Aralia nudicaulis", "Arisaema triphyllum", "Asclepias tuberosa", "Atriplex patula", "Aureolaria flava", "Carya glabra", "Celastrus scandens", "Cenchrus tribuloides", "Chimaphila maculata", "Cuscuta gronovii", "Dennstaedtia punctilobula", "Desmodium nudiflorum", "Desmodium rotundifolium", "Dryopteris marginalis", "Erechtites hieraciifolius", "Fragaria virginiana", "Galium circaezans", "Galium triflorum", "Gaylussacia baccata", "Geranium maculatum", "Geum virginianum", "Hamamelis virginiana",
LS0tCnRpdGxlOiAiUiBmb3IgUGh5bG9nZW5pZXM6IEludHJvZHVjdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU3R1ZGVudHMgc2hvdWxkIGNsb25lIHRoZSByZXBvc2l0b3J5IGZyb20gR2l0SHViIGFuZCB0aGVuIHdvcmsgdGhyb3VnaCBMaW5lIDMwMCBvZiB0aGlzIFIgTm90ZWJvb2sgYmVmb3JlIG91ciBEaWdpdGFsIExhYiBvbiBNYXJjaCA4dGguICAKCkNvbXBsZXRpbmcgZXhlcmNpc2VzIHdpbGwgcmVxdWlyZSBydW5uaW5nIGNvZGUgdG8gZ2V0IG91dHB1dCwgYW5kIHRoZW4gYWRhcHRpbmcgY29kZSBvciB3cml0aW5nIG5ldyBjb2RlLCBhbmQgcnVubmluZyBpdCB0byBiZSBzdXJlIGl0IGdpdmVzIGFwcHJvcHJpYXRlIG91dHB1dC4gQXMgYXBwcm9wcmlhdGUsIGFkZCBpbmN1ZGUgaGFzaC10YWdnZWQgY29tbWVudCBsaW5lcyB3aXRoaW4gY2h1bmtzIG9mIGNvZGUsIGFuZC9vciBhZGQgZGVzY3JpcHRpdmUsIGV4cGxhbmF0b3J5IG9yIGludGVycHJldGF0aXZlIG5vdGVzIGFib3V0IG91dHB1dC4gIAoKRHVyaW5nIHRoZSBNYXJjaCA4dGggc2Vzc2lvbiwgd2UnbGwgcXVpY2tseSByZXZpZXcgbWluaS1leGVyY2lzZXMuIFRoZXJlIGFyZSBmaXZlIG9mIHRoZW0sIGZvdXIgaW4gdGhlIGZpcnN0IHBhcnQuICBEdXJpbmcgdGhlIHNlc3Npb24gb24gRnJpZGF5LCB3ZSB3aWxsIHRoZW4gZGVsdmUgaW50byBsYXRlciBwb3J0aW9ucyBvZiB0aGlzIG5vdGVib29rLiBJdCdzIHVzZWZ1bCB0aGF0IHlvdSd2ZSByZWF0ZWQgKGFuZCBoYXZlIGhhbmR5KSBvbmUgbW9yZSBtb3JlIG9mIHRoZSBsaXN0cyAgY3JlYXRlZCBmb3Igc3VibWlzc2lvbiB3aXRoIFBvcnRmb2xpbyAyLCBiZWNhdXNlIHRoZXkncmUgdXNlZCBmb3IgbGF0ZXIgZXhlcmNpc2VzIGFuZCBjb21wbGV0aW5nIFBvcnRmb2xpbyAzLiAgVGhlcmUncyBhbHNvIGEgZmlmdGggYW5kIGZpbmFsIG1pbmktZXhlcmNpc2UgdG93YXJkIHRoZSBlbmQgb2YgdGhlIG5vdGVib29rLgoKVG8gYWRkIG5ldyBjb21tYW5kcyB0aGF0IGNhbiBiZSBydW4gYW5kIGFsc28gc2F2ZWQgdG8gcmUtcnVuIG9yIG1vZGlmeSBsYXRlcjogY2xpY2sgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgYWJvdmUgdG9vbGJhciBvciBwcmVzcyAqQ3RybCtBbHQrSSouIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBkaXJlY3RseSBrZXlib2FyZCB0aGlzIHdpdGggYSB0b3RhbCBvZiBzaXgga2V5c3Ryb2tlcyBhdCB0aGUgdG9wIChgYGB7cn0pIHRocmVlIGF0IHRoZSBib3R0b20gKGBgYCkuIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBoaWdobGlnaHQgYSBjaHVuayBvciBjZXJ0YWluIGxpbmVzIGluIGEgY2hjaywgYW5kIHRvIGNvcHktcGFzdGUgZWxzZXdoZXJlIGluIHRoZSBSIE5vdGVib29rIGRvY3VtZW50LiAKCiMjIyMgQUNLTk9XTEVER0VNRU5UUwpXaGF0J3MgYmVsb3cgaXMgY29tcGlsZWQgZnJvbSBvciBpbnNwaXJlZCBieSBtdWx0aXBsZSBzb3VyY2VzLiBNYXRlcmlhbCBjcmVhdGVkIGJ5IE5pY2hvbGFzIE1hdHprZSBhbmQgRGFuIFdhcnJlbiBoYXMgYmVlbiB1c2VkIGF0IHdvcmtzaG9wcyBhdCBOSU1CaW9zLiBSZWZlcmVuY2VzOiAKTWF0emtlLCBOaWNob2xhcyBKLjsgV2FycmVuLCBEYW4gKDIwMTYpLiAiSW50cm9kdWN0aW9uIHRvIFIsIHN0YXJ0aW5nIGZyb20gc2NyYXRjaC4iIApGcmVlIHRvIHVzZS9yZWRpc3RyaWJ1dGUgdW5kZXI6IEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtU2hhcmVBbGlrZSAzLjAgVW5wb3J0ZWQgKENDIEJZLU5DLVNBIDMuMCkgClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYWJvdmUgbGljZW5zZSwgbGlua2VkIGhlcmU6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzMuMC8KCk90aGVyIHVzZWZ1bCByZXNvdXJjZXM6CgpodHRwczovL3JvcGVuc2NpLm9yZy90dXRvcmlhbHMvCgpodHRwOi8vcGh5bG9kaXZlcnNpdHkubmV0L3BoeWxvbWF0aWMvCgpodHRwczovL2dpdGh1Yi5jb20vcm9wZW5zY2kvYnJyYW5jaGluZwoKCiMjIyBIT01FV09SSyBUTyBQUkVQQVJFIEZPUiBESUdJVEFMIExBQiAzCgpBcyB1c3VhbCwgYSBmaXJzdCBzdGVwIHVwb24gb3BlbmluZyBSIFN0dWRpbyBpcyB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZSBwYWNrYWdlcyB1c2luZyB0aGUgY29tbWFuZCAibGlicmFyeSIuIElmIHlvdSBoYXZlIG5ldmVyIHByZXZpb3VzbHkgaW5zdGFsbGVkIHRoZSBwYWNrYWdlLCB5b3UgbXVzdCBkbyB0aGF0IGZpcnN0LiAgCgpPZnRlbiB5b3UgYXJlIGRvd25sb2FkaW5nIHBhY2thZ2VzIGZyb20gd2hhdCdzIGNhbGxlZCBhICJDUkFOIFJlcG9zaXRvcnkiIHdpdGggQ1JBTiBzdGFuZGluZyBmb3IgIkNvbXByZWhlbnNpdmUgUiBBcmNoaXZlIE5ldHdvcmsiLiAKCkl0IGlzIGFsc28gcG9zc2libGUgdG8gZG93bmxvYWQgUiBQYWNrYWdlcyBmcm9tIEdpdEh1YiByZXBvc2l0b3JpZXMgaWYgeW91IGhhdmUgYSBwYWNrYWdlIGNhbGxlZCAiZGV2dG9vbHMiIGluc3RhbGxlZCBpbiBSIFN0dWRpby4gVGhhdCdzIGhvdyB3ZSBhcmUgZG93bmxvYWRpbmcgdGhlIHBhY2thZ2UgY2FsbGVkICJicnJhbmNoaW5nIiB3aGljaCBpcyBwYXJ0IG9mIGEgcHJvamVjdCBrbm93biBhcyBSIE9wZW4gU2NpZW5jZSAoaHR0cHM6Ly9yb3BlbnNjaS5vcmcvKQoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKGFwZSkKI2luc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKI2RldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigicm9wZW5zY2kvYnJyYW5jaGluZyIpCmxpYnJhcnkoImFwZSIpCiNsaWJyYXJ5KCJicnJhbmNoaW5nIikKYGBgCgojI1BoeWxvZ2VuaWVzCgpJbiBpbnRyb2R1Y3RvcnkgYmlvbG9neSwgeW91IHNob3VsZCBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBwaHlsb2dlbmllcyAtLSB3aHkgdGhleSBhcmUgaW1wb3J0YW50LCB0aGUgbWVhbmluZyBvZiB0aGVpciBncmFwaGljYWwgZm9ybWF0dGluZywgcGVyaGFwcyBob3cgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSByYXcgZGF0YSAoaW4gYW4gYXNzb2NpYXRlZCBjaGFyYWN0ZXIgbWF0cml4KS4gCgpIYXZpbmcgZGlzY3Vzc2VkIHRoYXQgYnJpZWZseSBkdXJpbmcgV2VkbmVzZGF5J3MgY2xhc3MsIHdlJ3JlIGdvaW5nIHRvIHJldmlldyBhbmQgd29yayB3aXRoIGFuIGludHVpdGl2ZSwgZWFzeSwgYW5kIHdpZGVzcHJlYWQgd2F5cyB0byBzdW1tYXJpemUgcGh5bG9nZW5ldGljIHJlbGF0aW9uc2hpcHM6IE5ld2ljayBjb2RlLiAgCgpUaGUgdGV4dCBpbiBncmVlbiBiZWxvdyBpcyB3aGF0IGEgc2ltcGxlIE5ld2ljayBzdHJpbmcgdmFyaWFibGUgbG9va3MgbGlrZS4gKEl0IGlzIGEgc3RyaW5nIHZhcmlhYmxlLCBzeW5vbnltb3VzIHdpdGggY2hhcmFjdGVyIHZhcmlhYmxlLikgTm90aWNlIHRoZSBzZW1pLWNvbG9uIGF0IHRoZSBlbmQsIG91dHNpZGUgb2YgdGhlIGxhc3QgY2xvc2luZyBwYXJlbnRoZXNpcy4gSXQgaXMgaW5pdGlhbGx5IGp1c3QgYmVpbmcgY3JlYXRlZCBhcyBhIGNoYXJhY3RlciB2YXJpYWJsZS4gVGhlbiBpdCBpcyBpZGVudGlmaWVkIGFzIGEgcGh5bG9nZW55ICgicmVhZCBhcyBhIHRyZWUiKSB1c2luZyB0aGUgY29tbWFuZCAicmVhZC50cmVlIiB3aGljaCBpcyBwYXJ0IG9mIHRoZSBSIFBhY2thZ2UgQVBFLiBUaGVuIGl0IGNhbiBiZSBwbG90dGVkIHRvIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGRlcGljdGlvbiBvZiB0aGUgcGh5bG9nZW55LgoKTW9yZSBvbiBOZXdpY2sgZm9ybWF0LCB3aGljaCwgYW5ub3lpbmdseSwgaXMgc29tZXRpbWVzIGluY29uc2lzdGVudDoKaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OZXdpY2tfZm9ybWF0CgpgYGB7cn0KbmV3aWNrX3N0ciA9ICIoKChIdW1hbnMsIENoaW1wcyksIEdvcmlsbGFzKSwgT3JhbmdzKTsiCiNIZXJlLCB3ZSBhcmUgZGVmaW5pbmcgYSBjaGFyYWN0ZXIgdmFyaWFibGUuIAp0cl9wcmltYXRlcyA9IHJlYWQudHJlZSh0ZXh0PW5ld2lja19zdHIpCiNOb3csIHdpdGggdGhlIGNvbW1hbmQgInJlYWQudHJlZSIgZnJvbSB0aGUgUGFja2FnZSBBUEUsIHdlIGFyZSBjb252ZXJ0aW5nIHRoYXQgc2ltcGxlIGNoYXJhY3RlciB2YXJpYWJsZSBieSByZWFkaW5nIGl0IGFzIGEgdHJlZSwgYWxzbyBrbm93biBhcyBhIHBoeWxvIG9iamVjdC4gVGhlIGZ1bmN0aW9uIGluIEFQRSBpcyBnb2luZyB0byB1bmRlcnN0YW5kIG5vdCBvbmx5IHRoYXQgdGhlcmUgYXJlIGZvdXIgInRpcCB0YXhhIiBidXQgYWxzbyB0aGF0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhcmVudGhlc2lzIGlzIG1lYW5pbmdmdWwgYXMgYSBoeXBvdGhlc2lzIGFib3V0IHRoZWlyIGV2b2x1dGlvbmFyeSByZWxhdGlvbnNoaXAsIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29ubmVjdCB0aGVtIGludG8gYSB0cmVlIGRpYWdyYW0gd2l0aCB0aHJlZSBub2RlcyAod2hpY2ggYXJlIGFuY2VzdHJhbCB0YXhhIHRvIHRoZXNlIHRpcCB0YXhhKS4gQmVmb3JlIHlvdSBydW4gdGhlIGNvZGUsIHRoaW5rIGFib3V0IHdoYXQgdGhlIHBoeWxvZ2VuZXRpYyB0cmVlIHNob3VsZCBsb29rIGxpa2UsIGJhc2VkbyBuIHdoYXQgeW91IGtub3cgYWJvdXQgdGhlc2UgZm91ciB0YXhhIGFuZCBhYm91dCB3aGF0IHlvdSBrbm93IGFib3V0IHRoZSBjb2RlLiAKcGxvdCh0cl9wcmltYXRlcykKI1RoaXMgbGFzdCBsaW5lIHNpbXBseSBwbG90dGVkIHRoZSBvYmplY3QgYXMgYSB0cmVlLiBNb3JlIGFib3V0IHRoaXMgYmVsb3cuIApgYGAKCllvdSBtYXkgcmVtZW1iZXIgdGhhdCBkdXJpbmcgRGlnaXRhbCBMYWIgMSBvbiBGZWJydWFyeSAxc3QsIHdlIHVzZWQgdGhlIGZ1bmN0aW9uICJwbG90IiB0byBtYWtlIGFuIFgtWSBwbG90LiAKCldoeSBjYW4gd2UgdXNlIGl0IGhlcmUgdG8gcGxvdCBhIHBoeWxvZ2VueT8gCgpJdCdzIGJlY2F1c2UgdGhlIGRhdGEgY2xhc3Mgb2YgInRyX3ByaW1hdGVzIiBpcyBzdG9yZWQgaW4gdGhlIGZpbGUgc3RydWN0dXJlIG9mIHRoZSBSIEVudmlyb25tZW50IGFzIGEgdHJlZSwgYSBsaXN0IG9mIGF0IGxlYXN0IHRocmVlIHRoaW5nczogdGlwcywgbm9kZXMsIGFuZCBlZGdlcy4gVGhpcyBzcGVjaWFsIHR5cGUgb2YgZGF0YSBvYmplY3QgaXMgdHlwaWNhbGx5IGNhbGxlZCBhIAoicGh5bG8gb2JqZWN0Ii4gCgpJZiB5b3UgbG9vayBpbiB0aGUgUiBTdHVkaW8gd2luZG8gYXQgdGhlIHVwcGVyIHJpZ2h0LCB5b3Ugc2hvdWxkIHNlZSBpbiB0aGUgIkVudmlyb25tZW50IiB0YWIgdGhhdCBvbmUgdGhpbmcgb24geW91ciBsaXN0IGlzIHRyX3ByaW1hdGUuIFlvdSBjYW4gZmluZCBvdXQgbW9yZSBhYm91dCBpdCBieSBjbGlja2luZywgYW5kIGl0IHdpbGwgb3BlbiBpbiBhIG5ldyB0YWIuIAoKSGVyZSdzIGEgd2F5IHRvIGFjY2VzcyB0aGUgaGVscCBtZW51IGZvciBzb21lIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCB0aGVzZSBjb21tYW5kcyBhcmUgZm9yLiBMb29rIGZvciB0aGUgZG9jdW1lbnRhdGlvbiB0byBhcHBlYXIgaW4gdGhlIGxvd2VyIGxlZnQtaGFuZCB3aW5kb3cgb2YgUiBTdHVkaW8uIApgYGB7cn0KP3Bsb3QKYGBgCgpXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcmVndWxhciBwbG90IGFuZCB0aGUgY29tbWFuZCBiZWxvdywgaWYgYW55PwpgYGB7cn0KP3Bsb3QucGh5bG8KYGBgCgoKIyMjIE1JTkkgRVhFUkNJU0UgMTogVW5kZXJzdGFuZGluZyBOZXdpY2sgYW5kIFBoeWxvIE9iamVjdHMKCkFzIGFuIGFsdGVybmF0aXZlIHRvIHVzaW5nIHRoZSBSIFN0dWRpbyB3aW5kb3cgYXQgdG9wIHJpZ2h0LCBpbnN0ZWFkIHdyaXRlIGFuZCBzdWJtaXQgYSBmZXcgY29tbWFuZHMgc3VjaCBhcwoKdHJfcHJpbWF0ZXMKCnN0cigidHJfcHJpbWF0ZXMiKQoKYW5kCgpzdHIodHJfcHJpbWF0ZXMpCgphdHRyaWJ1dGVzKHRyX3ByaW1hdGVzKQoKbmFtZXModHJfcHJpbWF0ZXMpIAoKR2VuZXJhdGUgb3V0cHV0LCBhbmQgdGhlbiB3cml0ZSBicmllZiBub3RlcyBhYm91dCB0aGUgaW5mb3JtYXRpb24geW91IGFyZSBnaXZlbiBieSBzdWJtaXR0aW5nIHRoZXNlIGNvbW1hbmRzLiAgCgpUaGVyZSBhcmUgbWFueSB0cmVlcyB0aGF0IGNhbiBiZSBkcmF3biB0byBzaG93IHJlbGF0aW9uc2hpcHMgb2YgZm91ciB0YXhhLiBTb21lIGhhdmUgdGhlIHNhbWUgdG9wb2xvZ3kgYW5kIHNpbXBseSByZS1hcnJhbmdlIHRoZSBwbGFjZW1lbnQgb2YgdGF4YSBvbiB0aGUgdGlwcy4gT3RoZXJzIGRpZmZlciBpbiB0aGUgdG9wb2xvZ3kgdGhhdCBjb25uZWN0cyB0aXBzIHRvIGludGVybmFsIG5vZGVzLiBBbW9uZyB0aGUgbWFueSBwb3NzaWJpbGl0aWVzLCBtYW55IGFyZSBpbmNvbnNpc3RlbnQgb3Igbm9uLXBhcnNpbW9uaW91cyB3aXRoIHJlc3BlY3QgdG8gIGF2YWlsYWJsZSBkYXRhIHVzZWQgZm9yIGluZmVycmluZyBwaHlsb2dlbmllcy4gVHlwaWNhbGx5IGZld2VyIHdpbGwgYmUgY29uc2lzdGVudCBhbmQgcGFyc2ltb25lb3VzLCBzb21ldGltZXMgb25lIHdpbGwgYmUgdW5pcXVlbHkgYmVzdCB0byBmaXQgdGhlIGRhdGEuIAoKVG8gZmluaXNoIHVwIE1pbmktRXhlcmNpc2UgMSwgd3JpdGUgbmV3IGNvZGUgd2l0aCBhIG5ldyBOZXdpY2sgc3RyaW5nIHZhcmlhYmxlLCByZWFkIHRoZSBzdHJpbmcgdXNpbmcgcmVhZC50cmVlLCBhbmQgcGxvdCBpdC4gVGhlIGdvYWwgaXMgdG8gZ2VuZXJhdGUgYSBmb3VyLXRheG9uIHRyZWUgd2l0aCBhIG5ldyB0b3BvbG9neS4gSXQgd2lsbCBiZSBhbiBlcnJvbmVvdXMgdHJlZSwgZGVwaWN0aW5nIHJlbGF0aW9uc2hpcHMgdGhhdCBjb250cmFkaWN0IHRvZGF5J3MgYmlvbG9naWNhbCBrbm93bGVkZ2UuIFRoYXQncyBva2F5OyB0aGlzIGlzIGp1c3QgYW4gZXhlcmNpc2UuCgpgYGB7cn0KdHJfcHJpbWF0ZXMKYGBgCgpgYGB7cn0Kc3RyKCJ0cl9wcmltYXRlcyIpCmBgYApgYGB7cn0Kc3RyKHRyX3ByaW1hdGVzKQpgYGAKYGBge3J9CmF0dHJpYnV0ZXModHJfcHJpbWF0ZXMpCmBgYApgYGB7cn0KCm5hbWVzKHRyX3ByaW1hdGVzKSAKYGBgCgpgYGB7cn0KbXluZXdpY2tfc3RyID0gIigoKG9ha3MsYmVlY2gpLCBtYWdub2xpYSksIHJlZHdvb2QpOyIKI0hlcmUsIHdlIGFyZSBkZWZpbmluZyBhIGNoYXJhY3RlciB2YXJpYWJsZS4gCnRyX3RyZWVzID0gcmVhZC50cmVlKHRleHQ9bXluZXdpY2tfc3RyKQojTm93LCB3aXRoIHRoZSBjb21tYW5kICJyZWFkLnRyZWUiIGZyb20gdGhlIFBhY2thZ2UgQVBFLCB3ZSBhcmUgY29udmVydGluZyB0aGF0IHNpbXBsZSBjaGFyYWN0ZXIgdmFyaWFibGUgYnkgcmVhZGluZyBpdCBhcyBhIHRyZWUsIGFsc28ga25vd24gYXMgYSBwaHlsbyBvYmplY3QuIFRoZSBmdW5jdGlvbiBpbiBBUEUgaXMgZ29pbmcgdG8gdW5kZXJzdGFuZCBub3Qgb25seSB0aGF0IHRoZXJlIGFyZSBmb3VyICJ0aXAgdGF4YSIgYnV0IGFsc28gdGhhdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnRoZXNpcyBpcyBtZWFuaW5nZnVsIGFzIGEgaHlwb3RoZXNpcyBhYm91dCB0aGVpciBldm9sdXRpb25hcnkgcmVsYXRpb25zaGlwLCBhbmQgYXQgdGhlIHNhbWUgdGltZSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbm5lY3QgdGhlbSBpbnRvIGEgdHJlZSBkaWFncmFtIHdpdGggdGhyZWUgbm9kZXMgKHdoaWNoIGFyZSBhbmNlc3RyYWwgdGF4YSB0byB0aGVzZSB0aXAgdGF4YSkuIEJlZm9yZSB5b3UgcnVuIHRoZSBjb2RlLCB0aGluayBhYm91dCB3aGF0IHRoZSBwaHlsb2dlbmV0aWMgdHJlZSBzaG91bGQgbG9vayBsaWtlLCBiYXNlZG8gbiB3aGF0IHlvdSBrbm93IGFib3V0IHRoZXNlIGZvdXIgdGF4YSBhbmQgYWJvdXQgd2hhdCB5b3Uga25vdyBhYm91dCB0aGUgY29kZS4gCnBsb3QodHJfdHJlZXMpCiNUaGlzIGxhc3QgbGluZSBzaW1wbHkgcGxvdHRlZCB0aGUgb2JqZWN0IGFzIGEgdHJlZS4gTW9yZSBhYm91dCB0aGlzIGJlbG93LiAKYGBgCgojIyMjIE92ZXJhbGwgbWVzc2FnZSBhYm91dCBwaHlsb2dlbmllcwpQaHlsb2dlbmllcyBoYXZlIHRpcHMsIG5vZGVzIGFuZCBlZGdlcy4gTm9kZXMgYXJlIGFuY2VzdG9ycyB0byB0aXBzLiBUaXBzIGFuZCBlZGdlcyBhcmUgY29ubmVjdGVkIGJ5IG5vZGVzLiBBbHNvLCByZWVjZW50IG9yIGRlcml2ZWQgbm9kZXMgY2FuICBjb25uZWN0IHRvIG9sZGVyIG9yIGFuY2VzdHJhbCBub2Rlc1RoZSBkZXRhaWxzIG9mIGhvdyB0aXBzIGFuZCBub2RlcyBjb25uZWN0ICh2aWEgZWRnZXMpIGlzIGRpY3RhdGUgYnkgdGhlIG5ld2ljayBjb2RlLiAKClRoaXMgaXMgdGVjaG5pY2FsIGJ1dCBiYXNpYyBqYXJnb24uIFdoYXQgaXMgY29tcGxleCBhbmQgcmljaCBpcyB0aGUgYmlvbG9naWNhbCBhbmQgZXZvbHV0aW9uYXJ5IG1lYW5pbmcgaW4gdGhpcyBmcmFtZXdvcmssIGltcG9ydGFudCBmb3IgdW5kZXJzdGFuZGluZyBjb25zZXJ2YXRpb24sIGV0aG5vYm90YW55LCBlY29sb2d5LCBjb25zZXJ2YXRpb24sIGV0aG5vYm90YW55IG9yIGNyb3AgYnJlZWRpbmcsIGFuZCBldm9sdXRpb25hcnkgcHJvY2Vzc2VzIHN1Y2ggYXMgbWlncmF0aW9uLCBoeWJyaWRpemF0aW9uLCBzcGVjaWF0aW9uIG9yIGV4dGluY3Rpb24uIAoKSWYgeW91ciBrbm93bGVkZ2Ugb3IgcmVjYWxsIG9mIHBoeWxvZ2VuaWVzIGFuZCBhc3NvY2lhdGVkIHZvY2FidWxhcnkgYXJlIGxpbWl0ZWQsIGhlcmUgaXMgYSBoYW5keSBnbG9zc2FyeSByZXNvdXJjZTogaHR0cDovL3BhZ2VzLnN0YXQud2lzYy5lZHUvfmxhcmdldC9HZW5ldGljczYyOS9vdXRsaW5lMS5wZGYKCiMjIFRpcCBhbmQgTm9kZSBTdHJ1Y3R1cmUgaW4gUGh5bG9nZW5pZXMgSW1wbHkgYSBIeXBvdGhlc2lzOiBTaW1wbGUgQm90YW5pY2FsIEV4YW1wbGVzCgpUaGUgY2h1bmsgYmVsb3cgaGFzIHJlcGVhdGVkIHRoZXNlIGNvbW1hbmRzLCBidXQgZm9yIHBsYW50IHRheGEuIAoKQmVmb3JlIHlvdSBydW4gdGhlIGNvZGUsIGNhbiB5b3UgdGVsbCBmcm9tIHRoZSBOZXdpY2sgY29kZSBpZiB0aGUgcGh5bG9nZW55IGlzIGJvdGFuaWNhbGx5IGNvcnJlY3Q/IE9yIGlzIGl0ICBlcnJvbmVvdXM/IENvbmZ1c2VkPyBSZWNhbGwgZnJvbSBjbGFzcyBvbiBXZWQgMy82IHRoYXQgTmV3aWNrIGZvcm1hdCBpcyBiYXNlZCBvbiBncm91cGluZ3MsIHdpdGggdGF4YSB0aGF0IGFyZSBtb3JlIHJlbGF0ZWQgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gdGF4YSB0aGF0IGFyZSBsZXNzIHJlbGF0ZWQuIEFsc28gcmVjYWxsIHdoYXQgeW91IGxlYXJuZWQgZnJvbSBpbnRyb2R1Y3RvcnkgYmlvbG9neSBpbiBoaWdoIHNjaG9vbCBvciBiaW9sb2d5IGFib3V0IGFib3V0IG1vbm9waHlsZXRpYyBncm91cHMgc3VjaCBhcyB0aGUgTW9ub2NvdHMgYW5kIEV1ZGljb3RzLiAgCgpgYGB7cn0KbmV3aWNrX3N0ciA9ICIoKChDYWJiYWdlLCBDb3JuKSwgS2FsZSksIFdoZWF0KTsiCnRyX3BsYW50cyA9IHJlYWQudHJlZSh0ZXh0PW5ld2lja19zdHIpCnBsb3QodHJfcGxhbnRzKQpgYGAKCklmIGl0IHdhcyBoYXJkIHRvIHNlZSByZWxhdGlvbnNoaXBzIGluIHRoZSBOZXdpY0sgZm9ybWF0LCBpcyBpdCBlYXNpZXIgaW4gdGhpcyBwbG90dGVkIHRyZWUgZm9ybWF0PyBIZXJlIGFyZSBtb3JlIHJlc291cmNlcyBpZiB5b3UgZmVlbCBsaWtlIHlvdSBuZWVkIG1vcmUgaGVscCB0byByZXZpZXcgcGxhbnQgZGl2ZXJzaXR5IG9yIHBoeWxvZ2VuZXRpY3MuIAoKaHR0cHM6Ly93d3cuZWJpLmFjLnVrL3RyYWluaW5nL29ubGluZS9jb3Vyc2UvaW50cm9kdWN0aW9uLXBoeWxvZ2VuZXRpY3MKaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQVBHX0lWX3N5c3RlbQoKSXMgdGhlIHBoeWxvZ2VueSBiZWxvdyBiZXR0ZXIgZm9yIHRoZXNlIGZvdXIgdGF4YT8gYW5kIHdoeSBvciB3aHkgbm90PyAoQ2FuIHlvdSB0ZWxsIGRpcmVjdGx5IGZyb20gdGhlIE5ld2ljayk/CgpgYGB7cn0KbmV3aWNrX3N0ciA9ICIoV2hlYXQsKENvcm4sKENhYmJhZ2UsIEthbGUpKSk7Igp0cjJfcGxhbnRzID0gcmVhZC50cmVlKHRleHQ9bmV3aWNrX3N0cikKcGxvdCh0cjJfcGxhbnRzKQpgYGAKCiMjIE1JTkktRVhFUkNJU0UgMgoKMS4gQ29weSwgcGFzdGUgYW5kIHJlLXdyaXRlIGEgY2h1bmsgb2YgY29kZSAob3Igd3JpdGUgaXQgZnJlc2gpOiB3cml0ZSBhIG5ldyBOZXdpY2sgdHJlZSBhcyBhcyBzdHJpbmcgdmFyaWFibGUsIHJlYWQgaXQgYXMgYSB0cmVlLCBhbmQgcGxvdCBpdC4gTWFrZSBzdXJlIGl0IGlzIGNvbnNpc3RlbnQgd2l0aCAyMDE4IGJvdGFuaWNhbCBrbm93bGVkZ2UgYWJvdXQgdGhlc2UgZm91ciB0YXhhLiBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IHRvcG9sb2d5LgoKYGBge3J9CmNlcmVhbHMgPSAiKCgoYmFybGV5LHdoZWF0KSxyaWNlKSwobWFpemUsc2hvcmd1bSkpOyIKdHIyX2NlcmVhbHMgPSByZWFkLnRyZWUodGV4dD1jZXJlYWxzKQpwbG90KHRyMl9jZXJlYWxzKQpgYGAKCgoyLiBUbyB0aGVzZSBmb3VyIHRheGEsIGFkZCB0d28gYWRkaXRpb25hbCB0YXhhOiByYWRpc2ggYW5kIHNlcXVvaWEuIEZvciB0aGVzZSBzaXggdGlwIHRheGEsIHdyaXRlIGEgbmV3IE5ld2ljayB2YXJpYWJsZSwgcmVhZCBpdCwgYW5kIHBsb3QgaXQuIFRoZW4gcmVwZWF0LiBBaW0gdG8gd3JpdGUgdHdvIGFsdGVybmF0aXZlIHRyZWVzOiBvbmUgZXJyb25lb3VzIGFuZCBvbmUgY29ycmVjdC4gCmBgYHtyfQpjZXJlYWxzcGx1czJ3cm9uZyA9ICIoKCgoYmFybGV5LHJhZGlzaCx3aGVhdCkscmljZSksKG1haXplLHNob3JndW0pKSxzZXF1b2lhKTsiCnRyMl9jZXJlYWxzcGx1czJ3cm9uZyA9IHJlYWQudHJlZSh0ZXh0PWNlcmVhbHNwbHVzMndyb25nKTsKcGxvdCh0cjJfY2VyZWFsc3BsdXMyd3JvbmcpOwpgYGAKCmBgYHtyfQpjZXJlYWxzcGx1czJyaWdodCA9ICIoKCgoKGJhcmxleSx3aGVhdCkscmljZSksKG1haXplLHNob3JndW0pKSxyYWRpc2gpLHNlcXVvaWEpOyIKdHIyX2NlcmVhbHNwbHVzMnJpZ2h0ID0gcmVhZC50cmVlKHRleHQ9Y2VyZWFsc3BsdXMycmlnaHQpOwpwbG90KHRyMl9jZXJlYWxzcGx1czJyaWdodCk7CmBgYAphLiBFeHBsYWluIHdoYXQncyB3cm9uZyBpbiB5b3VyIGVycm9uZW91cyB0cmVlIGFuZCBob3cgeW91J3ZlIGNvcnJlY3RlZCB0aGUgZXJyb3IgaW4gdGhlIG90aGVyIHRyZWUuIC4KYi4gVXNlIGNvbW1hbmRzIHN1Y2ggYXMgInN0ciIgb3IgImF0dHJpYnV0ZSIgYW5kIGNvbW1lbnQgYWJvdXQgd2hldGhlciB5b3VyIGVycm9uZW91cyBhbmQgY29ycmVjdCB0cmVlIGRpZmZlciBpbiB0aXBzLCBObm9kZXMsIG9yIGVkZ2VzLiAKCmBgYHtyfQp0cjJfY2VyZWFsc3BsdXMycmlnaHQKCgpzdHIodHIyX2NlcmVhbHNwbHVzMnJpZ2h0KQoKYXR0cmlidXRlcyh0cjJfY2VyZWFsc3BsdXMycmlnaHQpCgpuYW1lcyh0cjJfY2VyZWFsc3BsdXMycmlnaHQpIApgYGAKCgoKCiMjIEJyYW5jaGluZyBvcmRlciBhbmQgYnJhbmNoaW5nIGxlbmd0aHMKClJldHVybmluZyB0byB0aGUgb3JpZ2luYWwgdHJlZSwgV2hhdCB3YXMgYWRkZWQgdG8gdGhlIHRyZWUgYW5kIHRoZSBwbG90IG9mIHRoZSB0cmVlPwoKYGBge3J9Cm5ld2lja19zdHIgPSAiKCgoSHVtYW5zOjEyLjUsIENoaW1wczoxMi41KToxLjAsIEdvcmlsbGFzOjE0LjApOjEuMCwgT3JhbmdzOjE0LjUpOjEuMDsiCnRyX3ByaW1hdGUgPSByZWFkLnRyZWUodGV4dD1uZXdpY2tfc3RyKQpwbG90KHRyX3ByaW1hdGUpCmBgYAoKV2hhdCB3YXMgYWRkZWQgdG8gdGhlIHRyZWUgYW5kIHRoZSBwbG90IG9mIHRoZSB0cmVlPwoKYGBge3J9Cm5ld2lja19zdHIgPSAiKCgoSHVtYW5zOjYuMCwgQ2hpbXBzOjYuMClMQ0FfaHVtYW5zX2NoaW1wczoxLjAsIEdvcmlsbGFzOjcuMClMQ0Ffd19nb3JpbGxhczoxLjAsIE9yYW5nczo4LjApTENBX3dfb3JhbmdzOjEuMDsiCnRyX3ByaW1hdGUgPSByZWFkLnRyZWUodGV4dD1uZXdpY2tfc3RyKQpwbG90KHRyX3ByaW1hdGUsIHNob3cubm9kZS5sYWJlbD1UUlVFKQphdHRyaWJ1dGVzKHRyX3ByaW1hdGUpCnRyX3ByaW1hdGUKYGBgCgojIyBNSU5JLUVYRVJDSVNFIDMKCkluIE5vdmVtYmVyIDIwMTcsIHNjaWVudGlzdHMgZGlzY292ZXJlZCB0aGF0IHRoZXJlIGFyZSB0d28gT3Jhbmcgc3BlY2llcywgdGhlIGtub3duIHNwZWNpZXMgUG9uZ28gYWJlbGlpIGFuZCB0aGUgbmV3IHNwZWNpZXMgUG9uZ28gdGFwYW51bGllbnNpcy4gVGhlIHR3byB0YXhhIGFyZSBlc3RpbWF0ZWQgdG8gaGF2ZSBzZXBhcmF0ZWQgYWJvdXQgMy41IG1pbGxpb24geWVhcnMgYWdvLiBIb3cgd291bGQgeW91IG1vZGlmeSB0aGUgTmV3aWNrIHBvcnRpb24gb2YgY29kZSBhYm92ZSB0byBzaG93IHRoYXQgdGhlcmUgYXJlIHR3byBzcGVjaWVzPyAKCmBgYHtyfQpuZXdpY2tfc3RyID0gIigoKEh1bWFuczoxMi41LCBDaGltcHM6MTIuNSk6MS4wLCBHb3JpbGxhczoxNC4wKToxLjAsIE9yYW5nczoxNC41KToxLjA7Igp0cl9wcmltYXRlID0gcmVhZC50cmVlKHRleHQ9bmV3aWNrX3N0cikKcGxvdCh0cl9wcmltYXRlKQpgYGAKCiMjIERpc3BsYXlpbmcgUGh5bG9nZW5pZXMKCk5vdyBsZXQncyBleGFtaW5lIHNvbWUgb2YgdGhlIHR5cGVzIG9mIHRyZWVzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCwgc3RhcnRpbmcgd2l0aCB0aGUgZGVmYXVsdC4gCgpgYGB7cn0KcGxvdCh0cl9wcmltYXRlLCB0eXBlPSJwaHlsb2dyYW0iKQpgYGAKCmBgYHtyfQpwbG90KHRyMl9wbGFudHMsIHR5cGU9InBoeWxvZ3JhbSIsIGRpcmVjdGlvbj0icmlnaHR3YXJkcyIpCnBsb3QodHIyX3BsYW50cywgdHlwZT0icGh5bG9ncmFtIiwgZGlyZWN0aW9uPSJsZWZ0d2FyZHMiKQpwbG90KHRyMl9wbGFudHMsIHR5cGU9InBoeWxvZ3JhbSIsIGRpcmVjdGlvbj0idXB3YXJkcyIpCnBsb3QodHIyX3BsYW50cywgdHlwZT0icGh5bG9ncmFtIiwgZGlyZWN0aW9uPSJkb3dud2FyZHMiKQpgYGAKCmBgYHtyfQpwbG90KHRyMl9wbGFudHMsIHR5cGU9ImNsYWRvZ3JhbSIpCnBsb3QodHIyX3BsYW50cywgdHlwZT0iZmFuIikKcGxvdCh0cjJfcGxhbnRzLCB0eXBlPSJ1bnJvb3RlZCIpCnBsb3QodHIyX3BsYW50cywgdHlwZT0icmFkaWFsIikKYGBgCgpIZXJlJ3Mgc29tZXRoaW5nIGhhbmR5IC0gcHV0IGZvdXIgcGxvdHMgaW4gb25lIG91dHB1dCwgdXNpbmcgdGhlIGNvbW1hbmQgaW4gdGhlIGZpcnN0IGxpbmUgYmVsb3c6CmBgYHtyfQpsYXlvdXQobWF0cml4KDE6NCwgMiwgMikpCnBsb3QodHIyX3BsYW50cywgdHlwZT0iY2xhZG9ncmFtIikKcGxvdCh0cjJfcGxhbnRzLCB0eXBlPSJmYW4iKQpwbG90KHRyMl9wbGFudHMsIHR5cGU9InVucm9vdGVkIikKcGxvdCh0cjJfcGxhbnRzLCB0eXBlPSJyYWRpYWwiKQpgYGAKWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgdGhpY2tuZXNzIG9mIGFuIGVkZ2UsIGl0cyBjb2xvciwgaG93IGl0cyB0aXAgbGFiZWxzIGFyZSBvcmllbnRlZC4gCmBgYHtyfQpsYXlvdXQobWF0cml4KDE6NCwgMiwgMikpCnBsb3QodHIyX3BsYW50cywgdHlwZT0idW5yb290ZWQiLCBlZGdlLndpZHRoPTUpCnBsb3QodHIyX3BsYW50cywgdHlwZT0idW5yb290ZWQiLCBlZGdlLndpZHRoPTUsIGVkZ2UuY29sb3I9ImJsdWUiKQpwbG90KHRyMl9wbGFudHMsIHR5cGU9InVucm9vdGVkIiwgZWRnZS53aWR0aD01LCBlZGdlLmNvbG9yPSJibHVlIiwgbGFiNHV0PSJob3Jpem9udGFsIikKcGxvdCh0cjJfcGxhbnRzLCB0eXBlPSJ1bnJvb3RlZCIsIGVkZ2Uud2lkdGg9NSwgZWRnZS5jb2xvcj0iYmx1ZSIsIGxhYjR1dD0iYXhpYWwiKQpgYGAKClNvbWV0aW1lcyB5b3UgbWlnaHQgd2FudCB0byBhZGp1c3QgdGhlIG9yZGVyIHRoYXQgdGF4YSBhcHBlYXIgYWxvbmcgdGhlIHRpcCBsYWJlbHMuIE5vdGUgdGhhdCB3ZSBhcmUgbm90IGNoYW5naW5nIHRoZSB1bmRlcmx5aW5nIHBoeWxvLW9iamVjdCwgb3IgYW55dGhpbmcgYWJvdXQgcmVsYXRpb25zaGlwcyBieSBkb2luZyB0aGlzLiAKCmBgYHtyfQojIHJvdGF0ZSBjbGFkZXMgY29udGFpbmluZyBub2RlcyAzIGFuZCA0Ogp0cm5ld19wbGFudHMgPC0gcm90YXRlKHRyMl9wbGFudHMsIGMoIkNhYmJhZ2UiLCAiS2FsZSIpKQpwbG90KHRybmV3X3BsYW50cykKIyBjb21wYXJlIHRoZSByZXN1bHRzOgpwYXIobWZyb3c9YygxLDIpKSAjIHNwbGl0IGdyYXBoaWNhbCBkZXZpY2UKcGxvdCh0cjJfcGxhbnRzKSAjIHBsb3Qgb2xkIHRyZQpwbG90KHRybmV3X3BsYW50cykgIyBwbG90IG5ldyB0cmVlCmBgYAoKU29tZXRpbWVzIHlvdSB3YW50IHRvIHJlLWFycmFuZ2UgdGhlIGNsYWRlcyBvbiBhIHRyZWUsIHdoaWNoIGNhbiBiZSBkb25lIHdpdGggdGhlIGZ1bmN0aW9uIGxhZGRlcml6ZSwgd2hpY2ggaW4gInJpZ2h0IiBsYWRkZXJpemluZyBwdXRzIHRoZSBzbWFsbGVzdCBjbGFkZXMgYXQgdGhlIHRvcCAob3IgYXQgdGhlIGxlZnQpIGFuZCBpbiAibGVmdCIgbGFkZXJpemluZyBwdXRzIHRoZSBsYXJnZXN0IGNsYWRlcyBhdCB0aGUgdG9wIChvciBhdCB0aGUgcmlnaHQpLgoKYGBge3J9CmxheW91dChtYXRyaXgoMTo0LCAyLCAyKSkKcGxvdCh0cl9wcmltYXRlLCBtYWluID0gIm5vcm1hbCIpCnBsb3QobGFkZGVyaXplKHRyX3ByaW1hdGUpLCBtYWluID0gInJpZ2h0LWxhZGRlcml6ZWQiKQpwbG90KGxhZGRlcml6ZSh0cl9wcmltYXRlLCBGQUxTRSksIG1haW4gPSAibGVmdC1sYWRkZXJpemVkIikKbGF5b3V0KG1hdHJpeCgxLCAxKSkKYGBgCgpUaGUgY29kZSBiZWxvdyBzaG93cyB5b3UgY2FuIGxhZGRlcml6ZSAoYW5kIHdoYXQgbGFkZGVyaXppbmcgaXMgLSBhcnJhbmdpbmcgc3ViLWNsYWRlcyBpbiBvcmRlciBvZiBzaXplLCB3aGljaCBzaXplIHJlZmVycmluZyB0byB0aGUgbnVtYmVyIG9mIHRheGEgaW4gdGhlIHN1Yi1jbGFkZSkKCmBgYHtyfQpsYXlvdXQobWF0cml4KDE6NCwgMiwgMikpCnBsb3QodHJfcHJpbWF0ZSwgbWFpbiA9ICJub3JtYWwiLCB0eXBlID0gInBoeWxvZ3JhbSIsIGRpcmVjdGlvbiA9IGMoInVwd2FyZHMiKSkKcGxvdChsYWRkZXJpemUodHJfcHJpbWF0ZSksIG1haW4gPSAicmlnaHQtbGFkZGVyaXplZCIsIGRpcmVjdGlvbiA9IGMoInVwd2FyZHMiKSkKcGxvdChsYWRkZXJpemUodHJfcHJpbWF0ZSwgRkFMU0UpLCBtYWluID0gImxlZnQtbGFkZGVyaXplZCIsIGRpcmVjdGlvbj1jKCJ1cHdhcmRzIikpCmxheW91dChtYXRyaXgoMSwgMSkpCmBgYAoKIyMjIE1JTkkgRVhFUkNJU0UgNAoKUHJhY3RpY2UgYSBmZXcgb2YgdGhlc2UgZGF0YSBkaXNwbGF5IHRlY2huaXF1ZXMgdXNpbmcgdGhlIHNpeC10YXhvbiBwaHlsb2dlbnkgdGhhdCBpbmNsdWRlcyBjYWJiYWdlLCBrYWxlLCBjb3JuIGFuZCB3aGVhdCwgcGx1cyByYWRpc2ggYW5kIHNlcXVvaWEuCgpwbG90KHRyMl9jZXJlYWxzcGx1czJyaWdodCk7CgpgYGB7cn0KbGF5b3V0KG1hdHJpeCgxOjQsIDIsIDIpKQpwbG90KHRyMl9jZXJlYWxzcGx1czJyaWdodCwgdHlwZT0iY2xhZG9ncmFtIikKcGxvdCh0cjJfY2VyZWFsc3BsdXMycmlnaHQsIHR5cGU9ImZhbiIpCnBsb3QodHIyX2NlcmVhbHNwbHVzMnJpZ2h0LCB0eXBlPSJ1bnJvb3RlZCIpCnBsb3QodHIyX2NlcmVhbHNwbHVzMnJpZ2h0LCB0eXBlPSJyYWRpYWwiKQpgYGAKCmBgYHtyfQpsYXlvdXQobWF0cml4KDE6NCwgMiwgMikpCnBsb3QodHIyX2NlcmVhbHNwbHVzMnJpZ2h0LCB0eXBlPSJ1bnJvb3RlZCIsIGVkZ2Uud2lkdGg9NSwgZWRnZS5jb2xvcj0iYmx1ZSIpCnBsb3QodHIyX2NlcmVhbHNwbHVzMnJpZ2h0LCB0eXBlPSJ1bnJvb3RlZCIsIGVkZ2Uud2lkdGg9NSwgZWRnZS5jb2xvcj0icmVkIiwgbGFiNHV0PSJob3Jpem9udGFsIikKcGxvdCh0cjJfY2VyZWFsc3BsdXMycmlnaHQsIHR5cGU9InVucm9vdGVkIiwgZWRnZS53aWR0aD01LCBlZGdlLmNvbG9yPSJncmVlbiIsIGxhYjR1dD0iYXhpYWwiKQpgYGAKCmBgYHtyfQpsYXlvdXQobWF0cml4KDE6NCwgMiwgMikpCnBsb3QodHIyX2NlcmVhbHNwbHVzMnJpZ2h0LCBtYWluID0gIm5vcm1hbCIsIHR5cGUgPSAicGh5bG9ncmFtIiwgZGlyZWN0aW9uID0gYygidXB3YXJkcyIpKQpwbG90KGxhZGRlcml6ZSh0cjJfY2VyZWFsc3BsdXMycmlnaHQpLCBtYWluID0gInJpZ2h0LWxhZGRlcml6ZWQiLCBkaXJlY3Rpb24gPSBjKCJ1cHdhcmRzIikpCnBsb3QobGFkZGVyaXplKHRyMl9jZXJlYWxzcGx1czJyaWdodCwgRkFMU0UpLCBtYWluID0gImxlZnQtbGFkZGVyaXplZCIsIGRpcmVjdGlvbj1jKCJ1cHdhcmRzIikpCmBgYAoKCiMjIyBTQVZJTkcgRklMRVM6IGltcG9ydGFudCBmb3IgcmVwcm9kdWNpbmcgdHJlZXMgbGF0ZXIKCkFzIHBhcnQgb2YgUG9ydGZvbGlvIDMsIHdlJ2xsIGxlYXJuIHdheXMgb3V0c2lkZSBvZiBSIHRvIHdvcmsgd2l0aCB0cmVlcyB0byB2aXN1YWxseSBjaGFuZ2UgdGhpbmdzIGxpa2UgdGlwIGxhYmVscywgY29sb3IgY29kaW5nLCBldGMuIChUaGVyZSBhcmUgYWxzbyBwYWNrYWdlcyBpbiBSIHRvIGRvIHRoaXMsIGUuZy4gR0dUUkVFLikKCkZvciB0aGlzLCB5b3UnbGwgd2FudCB0byBiZSBhYmxlIHRvIHNhdmUgdGhlIE5ld2ljayBjb2RlIGZvciBhbnkgdHJlZSB0eXBlZCBpbiAob3IgaW1wb3J0ZWQgaW4gZnJvbSBkYXRhYmFzZSBzb3VyY2VzIHVzaW5nIFIgdG9vbHMpLiBIZXJlIGlzIGhvdyB0byBzYXZlIGEgbG9uZyBOZXdpY2sgYXMgYSBuYW1lZCB0ZXh0IGZpbGUuIFRoYXQgbWFrZXMgaXQgZWFzaWVyIHRvIGxhdGVyIHJlLWltcG9ydCB0aGUgZXhhY3QgdHJlZS4gCgpUaGlzIHdpbGwgc3RvcmUgdGhlIG5ldyBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIFlvdSBtYXkgd2FudCB0byB0aGVuIG1ha2UgYSBjb3B5IG9mIGl0IGFuZCBzdG9yZSBpdCBlbHNld2hlcmUsIHRvby4gKFlvdSBjYW4gZG8gdGhhdCBvdXRzaWRlIG9mIFIgU3R1ZGlvLCBvciB1c2luZyBGaWxlcyBpbiB0aGUgbG93ZXIgcmlnaHQgd2luZG93ZnJhbWUuKQoKYGBge3J9Cm5ld2lja19mbiA9ICJ0cjJfcGxhbnRzIgp3cml0ZS50cmVlKHRyMl9wbGFudHMsIGZpbGU9dHIyX3BsYW50cykKYGBgCgpgYGB7cn0KI0lmIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIGRpcmVjdG9yeSwgZmlyc3QgZmlndXJlIG91dCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5CmdldHdkKCkKI1RoZW4geW91IGNhbiBsb29rIGF0IHRoZSB3aW5kb3cgYXQgbG93ZXIgcmlnaHQsIGFuZCBjbGljayB0byB0aGUgY29ycmVjdCBkaXJlY3RvciB0byBmaW5kIHlvdXIgc2F2ZWQgZmlsZS4KYGBgCgpCeSB0aGUgd2F5LCBjYW4gc2F2ZSBhbnkgZGlzcGxheWVkIHRyZWUgdG8gUERGLCBvciBkbyBhIHNjcmVlbiBjYXB0dXJlIGV0Yy4KeW91IGNhbiBhbHNvIHNhdmUgYSB0cmVlIHRvIFBERiBhcyBzaG93biBiZWxvdy4gCgpgYGB7cn0KcGRmX2ZuID0gInRyMl9wbGFudHMucGRmIgpwZGYoZmlsZT1wZGZfZm4pCnBsb3QodHIyX3BsYW50cywgdHlwZT0idW5yb290ZWQiLCBlZGdlLndpZHRoPTUsIGVkZ2UuY29sb3I9ImJsdWUiLCBsYWI0dXQ9ImF4aWFsIikKZGV2Lm9mZigpCmBgYAoKSW4gTWFjcyAoYW5kIG1heWJlIFBDcyksIHRoaXMgd2lsbCBvcGVuIHRoZSBQREYgZnJvbSBSOgoKYGBge3J9CmNtZHN0ciA9IHBhc3RlKCJvcGVuICIsIHBkZl9mbiwgc2VwPSIiKQpzeXN0ZW0oY21kc3RyKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGFwZSkKI0hlcmUgaXMgdGhlIHBoeWxvZ2VueSBmcm9tIGxlY3R1cmUgb24gV2VkCm5ld2lja19sZWN0dXJlID0gIigoKCgoQSxCKSwoQyxEKSksKCgoRSxGKSxHKSkpLChIKSksKCgoKEksSiksSyksKEwsTSkpLCgoTiwwKSwoUCxRKSkpKTsiCnRyX2xlY3R1cmVGVUxMID0gcmVhZC50cmVlKHRleHQ9bmV3aWNrX2xlY3R1cmUpCnBsb3QodHJfbGVjdHVyZUZVTEwsIHR5cGU9ImNsYWRvZ3JhbSIsIGRpcmVjdGlvbj1jKCJ1cHdhcmRzIikpCmBgYAoKYGBge3J9CiNJbiBsZWN0dXJlIG9uIFdlZCwgd2UgYWxzbyBsb29rZWQgYXQgc3ViY2xhZGVzIHdpdGhpbiB0aGlzIGxhcmdlciBwaHlsb2dlbnkKbmV3aWNrX2xlY3R1cmUxID0gIigoKChFLEYpLEcpKSxIKTsiCnRyX2xlY3R1cmVTVUIxID0gcmVhZC50cmVlKHRleHQ9bmV3aWNrX2xlY3R1cmUxKQpwbG90KHRyX2xlY3R1cmVTVUIxLCB0eXBlPSJjbGFkb2dyYW0iLCBkaXJlY3Rpb249YygidXB3YXJkcyIpKQpuZXdpY2tfbGVjdHVyZTIgPSAiKCgoSSxKKSxLKSwoTCxNKSk7Igp0cl9sZWN0dXJlU1VCMiA9IHJlYWQudHJlZSh0ZXh0PW5ld2lja19sZWN0dXJlMikKcGxvdCh0cl9sZWN0dXJlU1VCMiwgdHlwZT0iY2xhZG9ncmFtIiwgZGlyZWN0aW9uPWMoInVwd2FyZHMiKSkKYGBgCgoKCiMjIFRISVMgSVMgTUFURVJJQUwgRk9SIE9VUiBESUdJVEFMIExBQiBTRVNTSU9OIE9OIEZSSURBWSBNQVJDSCA4CgojIyBUVVJOSU5HIExJU1RTIE9GIFBMQU5UIFRBWEEgSU5UTyBQSFlMT0dFTklFUzogUEhZTE9NQVRJQyAoUGFja2FnZSBCUlJBTkNISU5HKQoKQWJvdmUsIHdlIHVzZWQgYSBzaW1wbGUgdHJlZSBhbmQgcmVsaWVkIG9uIG91ciBvd24gd29ya2luZyBrbm93bGVkZ2UgdG8gZGV0ZXJtaW5lIHRoZSBOZXdpY2sgc3RyaW5nIGFuZCB0aGUgY29ycmVjdCBicmFuY2hpbmcgc2VxdWVuY2UgZm9yIG91ciB0YXhhLiAKCk1hbnkgc2NpZW50aXN0cyBpbiB0aGUgZmllbGQgb2Ygc3lzdGVtYXRpY3MgYXJlIGludm9sdmVkIGluIGNyZWF0aW5nIG5ldyBhbmQgbW9yZSBleHBhbnNpdmUgY2hhcmFjdGVyIG1hdHJpY2VzIGZpbGxlZCB3aXRoIGNvcGlvdXMgRE5BIGRhdGEgb3IgbW9ycGhvbG9naWNhbCBkYXRhLCBhbmQgbWFueSBtb3JlIHRoYW4gNCBvciA1IHRheGEuIFdlIGFyZSBub3QgZ29pbmcgdG8gZGVsdmUgaW50byB0aGUgcHJvdG9jb2xzIGZvciBhbWFzc2luZyBhbmQgbWFuaXB1bGF0aW5nIHN1Y2ggZGF0YSwgb3IgZm9yIGluZmVyIGFuZCBjb21waWxpbmcgcGh5bG9nZW5pZXMgZnJvbSB0aG9zZSBkYXRhLiAKCkluZGVlZCwgZ2l2ZW4gaG93IG11Y2ggaXMgYWxyZWFkeSBrbm93biBhYm91dCBwaHlsb2dlbmllcywgdGhhdCBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeSBpbiBtYW55IHN0dWRpZXMgb2YgYmlvZGl2ZXJzaXR5IGFza2luZyBxdWVzdGlvbnMgcmVsZXZhbnQgdG8gYmlvZ2VvZ3JhcGh5LCBjb25zZXJ2YXRpb24sIGV0aG5vYm90YW55IG9yIG1hY3JvZWNvbG9neS4gCgpCdXQgd2UgZGVmaW5pdGVseSB3aWxsIHdhbnQgdG8gd29yayB3aXRoIG1hbnkgbW9yZSB0aGFuIDQgb3IgNSB0YXhhLiBXZSB3YW50IHRvIHN0YXJ0IHdvcmtpbmcgdXAgdG8gdHJlZXMgd2l0aCBkb3plbnMgb2YgdGF4YSwgcG9zc2libHkgbW9yZS4gCgpUaGlzIHdlZWssIHdlJ2xsIGxvb2sgYXQgb25lIHRvb2wgdG8gb2J0YWluIGlucHV0IGZvciBhIGxpc3Qgb2YgdGF4YSwgYXMgZWl0aGVyIGEgcGxvdHRlZCB0cmVlIG9yIGEgTmV3aWNrIHRyZWUuIFRoZSBiYXNlIHJlZmVyZW5jZSB0byB0aGlzIGlzIGEgdHJlZSBrbm93biBhcyB0aGUgIlBoeWxvbWF0aWMgdHJlZSIgYW5kIHRoZXJlIGlzIGJhc2ljYWxseSBqdXN0IG9uZSBrZXkgc3RlcCAtLSBxdWVyeWluZyBQaHlsb21hdGljLgoKUGh5bG9tYXRpYyBoYXMgdGhlIHRhZ2xpbmUgIkkgY2FuIGhheiBhbGwgdGhlIHBoeWxvZ2VuaWVzIiBhbmQgY2FuIGRlYWwgd2l0aCByZWFsbHkgbGFyZ2UgdHJlZXMgd2l0aCBodW5kcmVkcyBvZiBmYW1pbGllcyBhbmQgdGhvdXNhbmRzIG9mIGdlbmVyYS4KCkhlcmUsIHdlIGFyZSBqdXN0IGdvaW5nIHRvIGlucHV0IGEgbGlzdCBvZiBwbGFudHMgYXMgYSB2ZWN0b3Igb2Ygc3RyaW5nIHZhcmlhYmxlcy4gV2UgYXJlIGp1c3QgZW50ZXJpbmcgYSBsaXN0LCBhbmQgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB1cCB0aGUgTmV3aWNrIGZvcm1hdCB3aXRoIHBhcmVudGhlc2VzIHNob3dpbmcgdGhlIG5lc3RlZG5lc3MgYW5kIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIHNwZWNpZXMuIEl0IGlzIGNyaXRpY2FsbHkgaW1wb3J0YW50IHRoYXQgdGhlc2UgYmUgY29ycmVjdGx5IHNwZWxsZWQgd2l0aCBwcm9wZXIgc3BlY2llcyBiaW5vbWlhbCBuYW1lcy4gKFRoaXMgaXMgcmVtaW5pc2NlbnQgb2YgdGhlICJzY3J1YmJlZCBzcGVjaWVzIGJpbm9taWFscyIgdGhhdCB3ZXJlIHVzZWQgaW4gdGhlIEJJRU4gZGF0YWJhc2UgYW5kIFIgQklFTiBwYWNrYWdlLikKCmBgYHtyfQojSWYgeW91IGRpZCBub3QgYWxyZWFkeSBsb2FkIHRoZSBQYWNrYWdlIGJycmFuY2hpbmcsIGJlIHN1cmUgdG8gZG8gc28gbm93LiBZb3UgbWF5IG5lZWQgdG8gYWxzbyBpbnN0YWxsIGl0LiAKI2luc3RhbGwucGFja2FnZXMoYXBlKQojaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyb3BlbnNjaS9icnJhbmNoaW5nIikKI2xpYnJhcnkoImFwZSIpCmxpYnJhcnkoImJycmFuY2hpbmciKQpgYGAKCgpgYGB7cn0KdGF4YTwtYygiUHVuaWNhIGdyYW5hdHVtIiwgIlRoZW9icm9tYSBjYWNhbyIsICJEb3JzdGVuaWEgY29udHJhamVydmEiLCAiTmVvbWFyaWNhIG5vcnRoaWFuYSIsICJaYW1pYSBmbG9yaWRhbmEiLCAiQWVjaG1lYSBmYXNjaWF0YSIsICJTb2xhbmRyYSBtYXhpbWEiLCAiR3JldmlsbGVhIHJvYnVzdGEiLCAiSmFzbWludW0gcG9seWFudGh1bSIsICJUaWJvdWNoaW5hIHVydmlsbGVhbmEiLCAiQW1vcnBob3BoYWxsdXMga29uamFjIiwgIlNhY2NoYXJ1bSBvZmZpY2luYXJ1bSIpCnRheGEKYGBgCgpGb3IgdGhlIHRlbiBzcGVjaWVzIGFib3ZlLCBhIHRyZWUgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHBoeWxvbWF0aWMsIGFuZCBwbG90dGVkLgoKRHVyaW5nIGxhYiwgSSdsbCBleHBsYWluIHRvIHlvdSBhYm91dCB0aGUgcmVmZXJlbmNlIGRhdGEgYW5kIHByb2NlZHVyZXMgYmVpbmcgdXNlZCB0byBkbyB0aGlzOgoKYGBge3J9CnRyZWVfcGh5bG9tYXRpYyA8LSBwaHlsb21hdGljKHRheGEgPSB0YXhhLCBzdG9yZWR0cmVlID0iUjIwMTIwODI5IiwgZ2V0ID0gJ1BPU1QnKQpwbG90KHRyZWVfcGh5bG9tYXRpYywgbm8ubWFyZ2luID0gVFJVRSkKYGBgCgpXZSBjYW4gYWxzbyB3cml0ZSB0aGUgdHJlZSBpbnRvIGEgdGV4dCBmaWxlLCBpbiBuZXdpY2sgZm9ybWF0OgoKYGBge3J9Cm5ld2lja19mbiA9ICJ0cmVlX3BoeWxvbWF0aWMiCndyaXRlLnRyZWUodHJlZV9waHlsb21hdGljLCBmaWxlPW5ld2lja19mbikKI0dvIGFuZCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBub3cgYSBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIE1ha2Ugc3VyZSB5b3UgYWxzbyBrbm93IGhvdyB0byBvcGVuIGl0IGluIGFub3RoZXIgcHJvZ3JhbSBsaWtlIGEgd29ya2Jvb2sgZmlsZS4gWW91IGFsc28gY2FuIGNvcHkgaXQgb250byB0aGUgY2xpcGJvYXJkIG9mIHRoZSBjb21wdXRlci4gCmBgYAoKCkxldCdzIHRyeSBvYnRhaW5pbmcgYW5vdGhlciB0cmVlIHVzaW5nIHRoZSBwaHlsb21hdGljIGZ1bmN0aW9uICh3aGljaCBpcyBpbiB0aGUgYnJyYW5jaGluZyBwYWNrYWdlOyBzZWUgdGhlIHRvcCBvZiB0aGUgbm90ZWJvb2spLgoKRnJvbSBvdXIgZWFybGllciB3b3JrIGluIFIgQklFTiwgd2UgaGFkIGEgbGlzdCBvZiB0ZW4gYnJlYWRmcnVpdCByZWxhdGl2ZXMsIGluIHRoZSBnZW51cyBBcnRvY2FycHVzCgogWzFdICJBcnRvY2FycHVzIGFuaXNvcGh5bGx1cyIgIkFydG9jYXJwdXMgZGFkYWgiICAgICAgICAiQXJ0b2NhcnB1cyBmdWx2aWNvcnRleCIgCiBbNF0gIkFydG9jYXJwdXMgaGlyc3V0dXMiICAgICAiQXJ0b2NhcnB1cyBpbnRlZ2VyIiAgICAgICJBcnRvY2FycHVzIGxvd2lpIiAgICAgICAKIFs3XSAiQXJ0b2NhcnB1cyBtYWluZ2F5aSIgICAgICJBcnRvY2FycHVzIG5pdGlkdXMiICAgICAgIkFydG9jYXJwdXMgcmlnaWR1cyIgICAgIApbMTBdICJBcnRvY2FycHVzIHNjb3J0ZWNoaW5paSIKCmBgYHtyfQpBcnRvPC1jKCJBcnRvY2FycHVzIGFuaXNvcGh5bGx1cyIsIkFydG9jYXJwdXMgZGFkYWgiLCJBcnRvY2FycHVzIGZ1bHZpY29ydGV4IiwiQXJ0b2NhcnB1cyBoaXJzdXR1cyIsIkFydG9jYXJwdXMgaW50ZWdlciIsIkFydG9jYXJwdXMgbG93aWkiLCJBcnRvY2FycHVzIG1haW5nYXlpIiwiQXJ0b2NhcnB1cyBuaXRpZHVzIiwiQXJ0b2NhcnB1cyByaWdpZHVzIiwiQXJ0b2NhcnB1cyBzY29ydGVjaGluaWkiKQp0YXhhCnRyZWVfcGh5bG9tYXRpY19BcnRvIDwtIHBoeWxvbWF0aWModGF4YSA9IEFydG8sIGdldCA9ICdQT1NUJykKcGxvdCh0cmVlX3BoeWxvbWF0aWNfQXJ0bywgbm8ubWFyZ2luID0gVFJVRSkKbmV3aWNrX2ZuMiA9ICJ0cmVlX3BoeWxvbWF0aWNfQXJ0byIKd3JpdGUudHJlZSh0cmVlX3BoeWxvbWF0aWNfQXJ0bywgZmlsZT1uZXdpY2tfZm4yKQpgYGAKCldoYXQgaXMgZ29pbmcgb24gaGVyZT8gV2hlcmUgZWxzZSBtaWdodCB3ZSBsb29rIGZvciBhIHByb3BlciB0cmVlPyAgQmVsb3csIHdlJ2xsIGV4cGxvcmUgdGhlIERSWUFEIERhdGFiYXNlLCBidXQgYWxzbyBjaGVjayBvdXQgdGhpcyBwdWJsaWNhdGlvbjogCiAgaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvYW9iL21jdzI0OQoKClBoeWxvbWF0aWMgaXMgcGFydCBvZiBSLU9wZW4tU2NpIGFuZCBpdCBoYXMgdGhlIHRhZ2xpbmUgIkkgY2FuIGhheiBhbGwgdGhlIHBoeWxvZ2VuaWVzIiBhbmQgY2FuIGRlYWwgd2l0aCByZWFsbHkgbGFyZ2UgdHJlZXMgd2l0aCBodW5kcmVkcyBvZiBmYW1pbGllcyBhbmQgdGhvdXNhbmRzIG9mIGdlbmVyYSwgYnV0IGl0IGlzIG5vdCBuZWNlc3NhcmlseSBnb2luZyB0byBwZXJmb3JtIHdlbGwgd2l0aGluIGEgZ2VudXMuIAoKSW4gRFJZQUQsIHRoZXJlIGlzIGEgVVJMIG9uIHRoZSBpbnRlcm5ldCB3aGVyZSB0aGUgc2NpZW50aXN0cyBoYXZlIHN0b3JlZCBhIHJhdy10ZXh0IGZpbGUgd2l0aCB0aGUgTmV3aWNrIGNvZGUgdGhhdCBpbmNsdWRlcyBkZXRhaWxzIHdpdGhpbiB0aGUgY29uaWZlcnMsIGluY2x1ZGluZyB0aGUgZ2VudXMgQWJpZXMuIApXSEFUIElTIFRIRSBQVUJMSUNBVElPTgpUaGlzIHRyZWUgYWxzbyBoYXMgYSBsb3Qgb2Ygb3RoZXIgZGF0YSB0aGF0IGlzIHVzZWZ1bCBmb3IgYW5naW9zcGVybXMuIFRha2UgYSBsb29rIGF0IGl0IGhlcmU6IGh0dHA6Ly9kYXRhZHJ5YWQub3JnL2JpdHN0cmVhbS9oYW5kbGUvMTAyNTUvZHJ5YWQuODc5MS9maW5hbF90cmVlLnRyZT9zZXF1ZW5jZT0xCgoKYGBge3J9CnNwcDEgPC0gYygiQWJpZXNfbm9yZG1hbm5pYW5hIiwgIkFiaWVzX2Jvcm5tdWVsbGVyaWFuYSIsICJBYmllc19jaWxpY2ljYSIsICJBYmllc19jZXBoYWxvbmljYSIsCiJBYmllc19udW1pZGljYSIsICJBYmllc19waW5zYXBvIiwgIkFiaWVzX2FsYmEiLCAiR2lua2dvIGJpbG9iYSIsICJOeW1waGFlYSBsb3R1cyIsICJJbGxpY2l1bSBtZXhpY2FudW0iLCAiTWFnbm9saWEgZnJhc2VyaSIsIkxpbmRlcmEgcHVsY2hlcnJpbWEiKQp1cmxBPC0iaHR0cDovL2RhdGFkcnlhZC5vcmcvYml0c3RyZWFtL2hhbmRsZS8xMDI1NS9kcnlhZC44NzkxL2ZpbmFsX3RyZWUudHJlP3NlcXVlbmNlPTEiCiNXZSBhcmUgbWFraW5nIGEgInNob3J0LWN1dCIgdmFyaWFibGUgdGhhdCBpcyBqdXN0IHRoZSBVUkwgZm9yIHRoaXMgdHJlZS4gCiNOb3cgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgZnVuY3Rpb24gcGh5bG9tYXRpYywgYW5kIGluc3RlYWQgb2YgdXNpbmcgb25lIG9mIHRoZSBzdG9yZWQgdHJlZXMsIHdlIGFyZSBnb2luZyB0byB1c2UgdGhlIHRyZWUgYXQgdGhhdCBVUkwuCkFiaWVzPC1waHlsb21hdGljKHRheGE9c3BwMSwgdHJlZXVyaT11cmxBKQpwbG90KEFiaWVzKQpgYGAKCgpBREQgT05FIE1PUkUgV0FZIFRPIERPIElUIC0gV0lUSCBUSEUgU0xBU0hQQVRIIE1FVEhPRApgYGB7cn0Kc3BwMSA8LSByZWFkLnRhYmxlKCJzbGFzaHBhdGgudHh0IikKI1lvdSBjYW4gZmluZCB0aGlzIGZpbGUgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSBhbmQgbG9vayBhdCBob3cgaXQgaXMgc2V0IHVwLiAKI05vdGUgdGhhdCBpdCBhbHJlYWR5IGFzc2lnbnMgZXZlcnkgc3BlY2llcyBhbmQvb3IgZ2VudXMgdG8gYSBmYW1pbHkKI1doZW4geW91IHBhc3MgaW4gc3BlY2llcyBuYW1lcyBvciBnZW51cyBuYW1lcywgdGhlIHBoeWxvbWF0aWMgZnVuY3Rpb24gYXV0b21hdGljYWxseSB1c2VzIGFuIFIgUGFja2FnZSBUQVhJWkUgdG8gbG9vayB1cCBhbmQgYXNzb2NpYXRlIHRoZSB0YXhvbiBuYW1lcyB3aXRoIHRoZSBmYW1pbHksIGFuZCB0aGVuIHRvIGZvcm1hdCB0aGUgZGF0YSB0byBmZWVkIGl0IGludG8gdGhlIHBoeWxvbWF0aWMgY29tbWFuZCB0aGlzIHdheS4gCiNUYWtlIGEgbG9vayBhdCB0aGUgb3V0cHV0IGZyb20gdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVsb3cgdG8gaW5zcGVjdCB0aGUgZGF0YSBhbmQgaG93IGl0cyBzZXQgdXAuCnNwcDEKdHJlZV9waHlsb21hdGljIDwtIHBoeWxvbWF0aWModGF4YSA9IHNwcDEpCiNXZSBoYXZlIGRyb3BwZWQgdGhlIEdldCA9UE9TVCBjb21tYW5kLgpwbG90KHRyZWVfcGh5bG9tYXRpYywgbm8ubWFyZ2luID0gVFJVRSkKYGBgCgoKCkEgcHJvYmxlbSB3aXRoIHRoaXMgdHJlZSBpcyB0aGF0IGl0IGRvZXMgbm90IGluY2x1ZGUgYnJhbmNoIGxlbmd0aHMuIAoKRm9yIHRoYXQsIHdlIGNhbiB0dXJuIGJhY2sgdG8gdGhlIG90aGVyIHBsYW50LXNwZWNpZmljIHN0b3JlZCB0cmVlIGluIFBoeWxvbWF0aWMsIGtub3duIGFzICJ6YW5uZTIwMTQiCgoKYGBge3J9CnRyZWVfcGh5bG9tYXRpYyA8LSBwaHlsb21hdGljKHRheGEgPSBzcHAxLCBzdG9yZWR0cmVlID0iemFubmUyMDE0IiwgZ2V0ID0gJ1BPU1QnKQpwbG90KHRyZWVfcGh5bG9tYXRpYywgbm8ubWFyZ2luID0gVFJVRSkKYGBgCgpIZXJlIGlzIGFub3RoZXIgZXhhbXBsZSBvZiBhIHRyZWUgd2l0aCB2YXJpYWJsZSBicmFuY2ggbGVuZ3Rocy4gCgpgYGB7cn0Kc3BwMSA8LSBjKCJBYmllc19ub3JkbWFubmlhbmEiLCAiQWJpZXNfYm9ybm11ZWxsZXJpYW5hIiwgIkFiaWVzX2NpbGljaWNhIiwgIkFiaWVzX2NlcGhhbG9uaWNhIiwKIkFiaWVzX251bWlkaWNhIiwgIkFiaWVzX3BpbnNhcG8iLCAiQWJpZXNfYWxiYSIsICJHaW5rZ28gYmlsb2JhIiwgIk55bXBoYWVhIGxvdHVzIiwgIklsbGljaXVtIG1leGljYW51bSIsICJNYWdub2xpYSBmcmFzZXJpIiwiTGluZGVyYSBwdWxjaGVycmltYSIpCnRyZWVfcGh5bG9tYXRpYyA8LSBwaHlsb21hdGljKHRheGEgPSB0YXhhLCBzdG9yZWR0cmVlID0iemFubmUyMDE0IiwgZ2V0ID0gJ1BPU1QnKQpwbG90KHRyZWVfcGh5bG9tYXRpYywgbm8ubWFyZ2luID0gVFJVRSkKYGBgCgoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgdGhpcyB0eXBlIG9mIGRhdGEgcGh5bG9nZW5pemVkOiBsaXN0cyBvZiBzcGVjaWVzIGZyb20gRW1pbHkgR3JlZ29yeSdzIGFuYXRvbXkgdGV4dGJvb2suIAoKYGBge3J9CkVHPC1jKCJBYmllcyIsCiJBaWxhbnRodXMiLAoiQXNwaWNsbHVtIiwKIkF0cmFnZW5lIiwKIkJhbmdpYSIsCiJCZWdvbmlhIiwKIkJlcmJlcmlzIiwKIkJldHVsYSIsCiJCbGFzaWEiLAoiQmxlY2hudW0iLAoiQ2F1bGVycGEiLAoiQ2VyYXRvcGh5bGx1bSIsCiJDaGVub3BvZGl1bSIsCiJDbGVtYXRpcyIsCiJDb2NjdWx1cyIsCiJDb3JhbGxvcnJoaXphIiwKIkNvcmNob3J1cyIsCiJDdWN1cmJpdGEiLAoiRGFobGlhIiwKIkRpb3Njb3JlYSIsCiJEcmFjYWVuYSIsCiJFcXVpc2V0dW0iLAoiRXVvbnltdXMiLAoiRXVwaG9yYmlhIiwKIkZhZ3VzIiwKIkZpY3VzIiwKIkZvbnRpbmFsaXMiLAoiRm9zc29tYnJvbmlhIiwKIkZyaXRpbGxhcmlhIiwKIkZ1Y3VzIiwKIkdsZWRpdHNjaGlhIiwKIkdsZW9jYXBzYSIsCiJIYXBsb21pdHJpdW0iLAoiSGVkZXJhIiwKIkhlbGlhbnRodXMiLAoiSGV0ZXJvY2VudHJvbiIsCiJIaXBwdXJpcyIsCiJIeXBvZGVybWEiLAoiSXNvZXRlcyIsCiJMaW51bSIsCiJMaXF1aWRhbWJhciIsCiJNYXJjaGFudGlhIiwKIk1vbW9yZGljYSIsCiJNb25vcG9kaXVtIiwKIk11Y29yIiwKIk5lcml1bSIsCiJOaXRlbGxhIiwKIk9zbXVuZGEiLAoiUGFuZGFudXMiLAoiUGFwYXZlciIsCiJQZWxhcmdvbml1bSIsCiJQaGxvbWlzIiwKIlBoeXRvbGFjY2EiLAoiUGludXMiLAoiUGxhdGFudXMiLAoiUG9seXRyaWNodW0iLAoiUG9wdWx1cyIsCiJQb3RhbW9nZXRvbiIsCiJQdW5jdHVtIiwKIlF1ZXJjdXMiLAoiUmljaW51cyIsCiJSdWJ1cyIsCiJTYWxpeCIsCiJTYW1idWN1cyIsCiJTY2xlcm90aXVtIiwKIlNlbGFnaW5lbGxhIiwKIlNlbXBlcnZpdnVtIiwKIlNwb25pYSIsCiJTdHlwb2NhdWxvbiIsCiJTeW1wb2RpdW0iLAoiVGF4b2RpdW0iLAoiVGVjb21hIiwKIlRyYWRlc2NhbnRpYSIsCiJVcnRpY2EiLAoiVmlvbGEiLAoiVml0aXMiLAoiV2lzdGVyaWEiLAoiWXVjY2EiKQojTm93IHdlIGFyZSBnb2luZyB0byBsb29rIGF0IHdoYXQgd2UganVzdCBjcmVhdGVkOgpFRwojSW4gdGhpcyBsaW5lLCB3ZSd2ZSBtYWRlIHRoZSBleHBsaWNpdCBhcmd1bWVudCB0byB1c2UgdGhlIGRlZmF1bCBSMjIwMTUwNDE1IHRyZWUgaW4gcGh5bG9tYXRpYyBhbmQgdGhlbiB0byBhbHNvIHVzZSB0aGUgemFubmUyMDE0IHRyZWUuIAojTm90ZSB0aGF0IGluY2x1ZGluZyB0aGUgYXJndW1lbnQgZ2V0ID0gIlBPU1QiIHdlIGFyZSBhc2tpbmcgdGhlIHBoeWxvbWF0aWMgZnVuY3Rpb24gdG8gY29ubmVjdCBvdXIgZ2VudXMgbmFtZXMgdG8gdGhlIGFwcHJvcHJpYXRlIGZhbWlseSBuYW1lcywgd2hpY2ggaXMgaG93IHBoeWxvbWF0aWMgZ29lcyBhYm91dCBhbGlnbmluZyBvdXIgbGlzdCB3aXRoIHRoZSBzdXBlcnRyZWUgcGh5bG9nZW55LCBhbmQgdGhlbiB0byBvdXRwdXQgYSB0cmVlIGZvciBvdXIgc3Vic2V0IG9mIHRheGEuCnRyZWVfcGh5bG9tYXRpY19FRzEgPC0gcGh5bG9tYXRpYyh0YXhhID0gRUcsIGdldCA9ICdQT1NUJykKcGxvdCh0cmVlX3BoeWxvbWF0aWNfRUcxLCBuby5tYXJnaW4gPSBUUlVFLCB0eXBlPSJjbGFkb2dyYW0iKQpuZXdpY2tfZm40ID0gInRyZWVfcGh5bG9tYXRpY19FRzEiCndyaXRlLnRyZWUodHJlZV9waHlsb21hdGljX0VHMSwgZmlsZT1uZXdpY2tfZm40KQojcmVwZWF0aW5nIHRvIGdldCB0cmVlIGZyb20gWmFubmUyMDE0CnRyZWVfcGh5bG9tYXRpY19FRzIgPC0gcGh5bG9tYXRpYyh0YXhhID0gRUcsIHN0b3JlZHRyZWUgPSJ6YW5uZTIwMTQiLCBnZXQgPSAnUE9TVCcpCnBsb3QodHJlZV9waHlsb21hdGljX0VHMiwgbm8ubWFyZ2luID0gVFJVRSwgdHlwZT0iY2xhZG9ncmFtIikKbmV3aWNrX2ZuNSA9ICJ0cmVlX3BoeWxvbWF0aWNfRUcyIgp3cml0ZS50cmVlKHRyZWVfcGh5bG9tYXRpY19FRzIsIGZpbGU9bmV3aWNrX2ZuNSkKYGBgCgojIyMjIE1JTkktRVhFUkNJU0UgNQoKCkRvIGFuZCB3cml0ZSB1cCBub3RlcyBhYm91dCB0d28gdGhpbmdzOgoKMS4gVHJ5IGdlbmVyYXRpbmcgdGhlc2UgdHJlZXMgYWdhaW4sIGJ1dCBjaGFuZ2UgZnJvbSBjbGFkb2dyYW0gdG8gcGh5bG9ncmFtLCBvciB0byBhbm90aGVyIGZvcm1hdCBmb3IgdGhlIHRyZWUuIAoKCmBgYHtyfQpwbG90KHRyZWVfcGh5bG9tYXRpY19FRzEsIHR5cGU9InBoeWxvZ3JhbSIpCnBsb3QodHJlZV9waHlsb21hdGljX0VHMiwgdHlwZT0icGh5bG9ncmFtIikKYGBgCgpgYGB7cn0KdHJlZV9waHlsb21hdGljX0VHMQoKc3RyKHRyZWVfcGh5bG9tYXRpY19FRzEpCgphdHRyaWJ1dGVzKHRyZWVfcGh5bG9tYXRpY19FRzEpCgpuYW1lcyh0cmVlX3BoeWxvbWF0aWNfRUcxKSAKCmBgYAoKYGBge3J9CnRyZWVfcGh5bG9tYXRpY19FRzIKCnN0cih0cmVlX3BoeWxvbWF0aWNfRUcyKQoKYXR0cmlidXRlcyh0cmVlX3BoeWxvbWF0aWNfRUcyKQoKbmFtZXModHJlZV9waHlsb21hdGljX0VHMikgCgpgYGAKCjIuIFRoZW4sIGxvb2tpbmcgYXQgYWxsIHlvdXIgb3V0cHV0LCB3aGF0IGRpZmZlcnMgbW9zdCBub3RpY2FibHkgYmV0d2VlbiB0aGUgcGFpciBvZiB0cmVlcywgYW5kIGhvdy93aHkgZG9lcyB0aGlzIHJlbGF0ZSB0byB0aGUgc3RvcmVkdHJlZSB1c2VkIHRvIGdlbmVyYXRlIHRoZW0/IFRyeSB0byBleHBsYWluIHdoYXQgdGhpcyBtZWFucyBpbiB5b3VyIG93biB3b3Jkcy4gCgoKCgozLiBMYXN0bHksIGxvb2sgYXQgdGhlIG91dHB1dCBhbmQgeW91J2xsIHNlZSB0aGF0IG1hbnkgdGF4YSB3ZXJlIGV4Y2x1ZGVkLiBUcnkgbG9va2luZyB0aGVtIHVwIGluIEVPTCBvciBXaWtpcGVkaWEuIFdoeSB3YXMgaXQgZGlmZmljdWx0IHRvIGluY2x1ZGUgdGhlbT8gV2hhdCBkb2VzIHRoaXMgc2F5IGFib3V0IHRoZSBoaXN0b3J5IG9mIGJvdGFueT8gQXJlIHRoZXJlIHNvbWUgdGhpbmdzIHRoYXQgd2VyZSBleGNsdWRlZCB0aGF0IHNob3VsZCBub3QgaGF2ZSBiZWVuIGV4Y2x1ZGVkLiAgCgoKCgoKCgoKIyBGSU5JU0hJTkcgVVAgLSBNSUNSTy1FWEVSQ0lTRVMgQU5EIEEgTUFDUk8tRVhFUkNJU0UKClRvIGZpbmlzaCB1cCBhbGwgdGhlIGhvbWV3b3JrIGFuZCB3b3JrIGZyb20gdG9kYXksIHlvdSBuZWVkIHRvIHdvcmsgdGhyb3VnaCBhbGwgdGhlIG1pbmktZXhlcmNpc2VzIENPUlJFQ1RMWS4gQXMgYXBwcm9wcmlhdGUsIGFmdGVyIG91ciBEaWdpdGFsIExhYiAzIHNlc3Npb24gb24gMy81LCB0YWtlIHRpbWUgdG8gZ28gYmFjayBhbmQgY29tcGxldGUgdGhlbSAoYW5kIGFkZCB5b3VyIGNvbW1lbnRhcnkpLgoKTmV4dCwgeW91IHByZXBhcmVkIGxpc3RzIGZvciBQb3J0Zm9saW8gMi4gWW91IGNhbiB1c2UgdGhlc2UgdG8gZmluaXNoIHVwIHRoaXMgd29ya2Jvb2ssIGFzIGxvbmcgYXMgeW91IGhhdmUgYXQgbGVhc3QgdHdvIGxpc3RzIG9mIDI1IHRheGEgZWFjaC4gCgpGb3JtYXQgdGhlIGxpc3Qgc28gdGhhdCB5b3UgY2FuIGVudGVyIGl0IGludG8gdGhlIHBoeW9tYXRpYyBjb21tYW5kcyBhYm92ZSAtLSBwcm9iYWJseSBieSBjdXR0aW5nIGFuZCBwYXN0aW5nIGEgbGlzdCBvZiB0YXhhLiBZb3UgbWF5IG5lZWQgdG8gaW5zZXJ0IHF1b3RhdGlvbiBtYXJrcyBhbmQvb3IgY29tbWFzLiAKSSBlbmNvdXJhZ2UgeW91IHRvIHRyeSBhIGRpZmZyZW50IHdheSBvZiBkb2luZyB0aGlzOiBwcmVwYXJlIGEgZmlsZSwgc2F2ZSBpdCBhcyBhICoudHh0IGZpbGUgYW5kIHRoZW4gcmVhZCBpdCBhbmQgdXNlIHRoZSBmaWxlLgoKWW91ciBsaXN0L2ZpbGUgY2FuIHRoZW4gYmUgdXNlZCB0byBvYnRhaW4gYSBwaHlsb2dlbmV0aWMgdHJlZSB1c2luZyB0aGUgY29kZSBsZWFybmVkIGFib3ZlIGZvciBQaHlsb21hdGljLiAKClBsb3QgeW91ciB0cmVlIGluIG9uZSBvciBtb3JlIGZvcm1hdHMgKGUuZy4sIGZhbiwgcGh5bG9nZW55LCBjbGFkb2dyYW0pLiBTYXZlIHRoYXQgaW4gcGRmIGZvcm1hdC4gCgpZT3Ugd2VyZSBhYmxlIHRvIG1ha2UgdGhvc2UgcGxvdHMgYmVjYXVzZSBwaHlsb21hdGljIGdlbmVyYXRlZCBOZXdpY2sgdHJlZXMsIHdoaWNoIHlvdSB5b3UgbmVlZCB0byBzYXZlLCB0b28uIFVzZSAgKi50eHQgZm9ybWF0LiAKCllvdSBjYW4gdGhlbiB1c2UgdGhvc2Ugb3V0cHV0IGZpbGVzIHRvIGJlZ2luIHRoZSBwYXJ0IG9mIHRoZSBQb3J0Zm9saW8gdGhhdCB1c2VzIEludGVyYWN0aXZlIFRyZWUgb2YgTGlmZS4gCgpMYXN0bHksIGJlIHN1cmUgdG8gc2F2ZSB5b3VyIFIgTm90ZWJvb2sgd2l0aCBhcHByb3ByaWF0ZSBvdXRwdXQgYW5kIGNvbW1lbnRhcnkuIAoKV2hlbiB5b3VyIGZpbmlzaGVkIHdpdGggdGhpcyBwYXJ0IG9mIFBvcnRmb2xpbyAzLCB5b3UgY2FuIGFuZCBzaG91bGQgcHVzaCB0aGUgbm90ZWJvb2sgYW5kIGFzc29jaWF0ZWQgZXhwb3J0ZWQgZmlsZXMgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgR2l0SHViIFJlcG9zaXRvcnkgZm9yIERpZ2l0YWwgTGFiIDMuICAKCmBgYHtyfQpMRVM8LWMoIkFjZXIgcnVicnVtIiwgIkRpY2hhbnRoZWxpdW0gZGVwYXVwZXJhdHVtIiwgIkVyaWdlcm9uIHN0cmlnb3N1cyIsICJFdXJ5YmlhIGRpdmFyaWNhdGEiLCAiUGFydGhlbm9jaXNzdXMgcXVpbnF1ZWZvbGlhIiwgIlBydW51cyBzZXJvdGluYSIsICJSdWJ1cyBhbGxlZ2hlbmllbnNpcyIsICJTbWlsYXggcm90dW5kaWZvbGlhIiwgIlZpYnVybnVtIHBydW5pZm9saXVtIiwgIlZpb2xhIGN1Y3VsbGF0YSIsICJBY2FseXBoYSB2aXJnaW5pY2EiLCAiUHRlcmlkaXVtIGFxdWlsaW51bSIsICJDYXN0YW5lYSBkZW50YXRhIiwgIlF1ZXJjdXMgcnVicmEiLCAiUmh1cyBjb3BhbGxpbnVtIiwgIlNwYXJ0aW5hIGFsdGVybmlmbG9yYSIsICJTcGFydGluYSBwYXRlbnMiLCAiVmlidXJudW0gYWNlcmlmb2xpdW0iLCAiTXVobGVuYmVyZ2lhIHNjaHJlYmVyaSIsICJBbmVtb25lIHZpcmdpbmlhbmEiLCAiQXJhYmlzIGxhZXZpZ2F0YSIsICJBcmFsaWEgbnVkaWNhdWxpcyIsICJBcmlzYWVtYSB0cmlwaHlsbHVtIiwgIkFzY2xlcGlhcyB0dWJlcm9zYSIsICJBdHJpcGxleCBwYXR1bGEiLCAiQXVyZW9sYXJpYSBmbGF2YSIsICJDYXJ5YSBnbGFicmEiLCAiQ2VsYXN0cnVzIHNjYW5kZW5zIiwgIkNlbmNocnVzIHRyaWJ1bG9pZGVzIiwgIkNoaW1hcGhpbGEgbWFjdWxhdGEiLCAiQ3VzY3V0YSBncm9ub3ZpaSIsICJEZW5uc3RhZWR0aWEgcHVuY3RpbG9idWxhIiwgIkRlc21vZGl1bSBudWRpZmxvcnVtIiwgIkRlc21vZGl1bSByb3R1bmRpZm9saXVtIiwgIkRyeW9wdGVyaXMgbWFyZ2luYWxpcyIsICJFcmVjaHRpdGVzIGhpZXJhY2lpZm9saXVzIiwgIkZyYWdhcmlhIHZpcmdpbmlhbmEiLCAiR2FsaXVtIGNpcmNhZXphbnMiLCAiR2FsaXVtIHRyaWZsb3J1bSIsICJHYXlsdXNzYWNpYSBiYWNjYXRhIiwgIkdlcmFuaXVtIG1hY3VsYXR1bSIsICJHZXVtIHZpcmdpbmlhbnVtIiwgIkhhbWFtZWxpcyB2aXJnaW5pYW5hIiwgIkhpZXJhY2l1bSBzY2FicnVtIiwgIkl2YSBmcnV0ZXNjZW5zIiwgIkp1bmlwZXJ1cyB2aXJnaW5pYW5hIiwgIkthbG1pYSBsYXRpZm9saWEiLCAiTGFjdHVjYSBjYW5hZGVuc2lzIiwgIkxlc3BlZGV6YSBwcm9jdW1iZW5zIiwgIkxpbW9uaXVtIGNhcm9saW5pYW51bSIsICJMaW51bSB2aXJnaW5pYW51bSIsICJMb2JlbGlhIGluZmxhdGEiLCAiTG9uaWNlcmEgc2VtcGVydmlyZW5zIiwgIk1haWFudGhlbXVtIHJhY2Vtb3N1bSIsICJNaXRjaGVsbGEgcmVwZW5zIiwgIk11aGxlbmJlcmdpYSBzb2JvbGlmZXJhIiwgIlBhbmljdW0gdmlyZ2F0dW0iLCAiUGhlZ29wdGVyaXMgaGV4YWdvbm9wdGVyYSIsICJQaHJ5bWEgbGVwdG9zdGFjaHlhIiwgIlBoeXNhbGlzIGhldGVyb3BoeWxsYSIsICJQaW51cyByaWdpZGEiLCAiUGxhbnRhZ28gbWFyaXRpbWEiLCAiUG9seWdvbnVtIHNjYW5kZW5zIiwgIlBvbHlzdGljaHVtIGFjcm9zdGljaG9pZGVzIiwgIlBvdGVudGlsbGEgbm9ydmVnaWNhIiwgIlJvc2EgY2Fyb2xpbmEiLCAiU2FyY29jb3JuaWEgcGVyZW5uaXMiLCAiU2F4aWZyYWdhIHZpcmdpbmllbnNpcyIsICJTaWxlbmUgY2Fyb2xpbmlhbmEiLCAiU29saWRhZ28gY2Flc2lhIiwgIlNvbGlkYWdvIG5lbW9yYWxpcyIsICJTb2xpZGFnbyBzZW1wZXJ2aXJlbnMiLCAiVHJpb2RhbmlzIHBlcmZvbGlhdGEiLCAiVmFjY2luaXVtIGNvcnltYm9zdW0iLCAiVmlvbGEgcGFsbWF0YSIsICJWaXRpcyBsYWJydXNjYSIsICJMZXNwZWRlemEgaGlydGEiLCAiRXV0aGFtaWEgZ3JhbWluaWZvbGlhIiwgIkhlcGF0aWNhIG5vYmlsaXMiLCAiQWN0YWVhIHBhY2h5cG9kYSIsICJDb3JudXMgYWx0ZXJuaWZvbGlhIiwgIkxpcmlvZGVuZHJvbiBUdWxpcGlmZXJhIiwgIlBocmFnbWl0ZXMgYXVzdHJhbGlzIiwgIlB5Y25hbnRoZW11bSB2aXJnaW5pYW51bSIsICJSdWJ1cyBjYW5hZGVuc2lzIiwgIlF1ZXJjdXMgcHJpbnVzIiwgIkFudGVubmFyaWEgcGxhbnRhZ2luaWZvbGlhIiwgIkFwb2N5bnVtIGNhbm5hYmludW0iLCAiQ2lyc2l1bSBob3JyaWR1bHVtIiwgIkNpcnNpdW0gcHVtaWx1bSIsICJGZXN0dWNhIHJ1YnJhIiwgIkhpZXJhY2l1bSBwYW5pY3VsYXR1bSIsICJPZW5vdGhlcmEgYmllbm5pcyIsICJTY2hpemFjaHlyaXVtIHNjb3Bhcml1bSIsICJUcmljaG9zdGVtYSBkaWNob3RvbXVtIiwgIlRyaWRlbnMgZmxhdnVzIiwgIkF0aHlyaXVtIGZpbGl4LWZlbWluYSIsICJDbGVtYXRpcyB2aXJnaW5pYW5hIiwgIlBvbHlnYWxhIHZlcnRpY2lsbGF0YSIsICJQb3B1bHVzIHRyZW11bG9pZGVzIiwgIlNvbGlkYWdvIG9kb3JhIiwgIkFjYWx5cGhhIGdyYWNpbGVucyIsICJBZ2FsaW5pcyBtYXJpdGltYSIsICJBZ2FsaW5pcyB0ZW51aWZvbGlhIiwgIkFncm9zdGlzIGh5ZW1hbGlzIiwgIkFncm9zdGlzIHBlcmVubmFucyIsICJBcmFiaXMgbHlyYXRhIiwgIkJ1bGJvc3R5bGlzIGNhcGlsbGFyaXMiLCAiQ2FyZXggY2VwaGFsb3Bob3JhIiwgIkNhcmV4IHBlbnN5bHZhbmljYSIsICJDYXJleCB1bWJlbGxhdGEiLCAiQ2FyeWEgYWxiYSIsICJDaGltYXBoaWxhIHVtYmVsbGF0YSIsICJDaW1pY2lmdWdhIHJhY2Vtb3NhIiwgIkNvcnlsdXMgYW1lcmljYW5hIiwgIkN5cHJpcGVkaXVtIGFjYXVsZSIsICJEZXNtb2RpdW0gZ2xhYmVsbHVtIiwgIkRlc21vZGl1bSBtYXJpbGFuZGljdW0iLCAiRGVzbW9kaXVtIHBhbmljdWxhdHVtIiwgIkRpc3RpY2hsaXMgc3BpY2F0YSIsICJFbGVvY2hhcmlzIHBhcnZ1bGEiLCAiRXF1aXNldHVtIGFydmVuc2UiLCAiRXVwYXRvcml1bSByb3R1bmRpZm9saXVtIiwgIkhpYmlzY3VzIG1vc2NoZXV0b3MiLCAiSGllcmFjaXVtIHZlbm9zdW0iLCAiSXJpcyB2ZXJzaWNvbG9yIiwgIkp1bmN1cyBnZXJhcmRpaSIsICJMZWNoZWEgbXVjcm9uYXRhIiwgIkxlc3BlZGV6YSB2aW9sYWNlYSIsICJNb3JlbGxhIHBlbnN5bHZhbmljYSIsICJOeXNzYSBzeWx2YXRpY2EiLCAiUGFuaWN1bSBjYXBpbGxhcmUiLCAiUGVkaWN1bGFyaXMgY2FuYWRlbnNpcyIsICJQaG90aW5pYSBtZWxhbm9jYXJwYSIsICJQb3RlbnRpbGxhIGNhbmFkZW5zaXMiLCAiUG90ZW50aWxsYSBzaW1wbGV4IiwgIlB5Y25hbnRoZW11bSB0ZW51aWZvbGl1bSIsICJQeXJvbGEgYW1lcmljYW5hIiwgIlF1ZXJjdXMgYWxiYSIsICJRdWVyY3VzIGNvY2NpbmVhIiwgIlF1ZXJjdXMgdmVsdXRpbmEiLCAiUmFudW5jdWx1cyBhYm9ydGl2dXMiLCAiUmFudW5jdWx1cyByZWN1cnZhdHVzIiwgIlJ1YnVzIGhpc3BpZHVzIiwgIlJ1YnVzIG9jY2lkZW50YWxpcyIsICJSdWJ1cyBwZW5zaWx2YW5pY3VzIiwgIlNjaG9lbm9wbGVjdHVzIGFtZXJpY2FudXMiLCAiU2VyaWNvY2FycHVzIGFzdGVyb2lkZXMiLCAiU29saWRhZ28gYmljb2xvciIsICJTb2xpZGFnbyBjYW5hZGVuc2lzIiwgIlRyaWdsb2NoaW4gbWFyaXRpbXVtIiwgIlZhY2Npbml1bSBwYWxsaWR1bSIsICJWZXJub25pYSBub3ZlYm9yYWNlbnNpcyIsICJWaXRpcyBhZXN0aXZhbGlzIiwgIkx5Y29wb2RpdW0gY29tcGxhbmF0dW0iLCAiTXlvc290aXMgdmVybmEiLCAiUHlyb2xhIGVsbGlwdGljYSIsICJTaWxlbmUgc3RlbGxhdGEiLCAiVmVyYmVuYSB1cnRpY2lmb2xpYSIsICJBbGxpdW0gY2FuYWRlbnNlIiwgIkNlYW5vdGh1cyBhbWVyaWNhbnVzIiwgIkh5cG94aXMgaGlyc3V0YSIsICJMZXNwZWRlemEgY2FwaXRhdGEiLCAiU3BoZW5vcGhvbGlzIG9idHVzYXRhIiwgIkFzY2xlcGlhcyBwdXJwdXJhc2NlbnMiLCAiQmFjY2hhcmlzIGhhbGltaWZvbGlhIiwgIkNhcnBpbnVzIGNhcm9saW5pYW5hIiwgIkNlbHRpcyBvY2NpZGVudGFsaXMiLCAiQ2hhbWFlc3ljZSBudXRhbnMiLCAiQ2xldGhyYSBhbG5pZm9saWEiLCAiQ29ybnVzIHJhY2Vtb3NhIiwgIkRyeW9wdGVyaXMgaW50ZXJtZWRpYSIsICJMaXF1aWRhbWJhciBzdHlyYWNpZmx1YSIsICJSb3NhIHZpcmdpbmlhbmEiLCAiVml0aXMgcmlwYXJpYSIsICJBcGlvcyBhbWVyaWNhbmEiLCAiTGFjdHVjYSBiaWVubmlzIiwgIkFtYnJvc2lhIGFydGVtaXNpaWZvbGlhIiwgIkRhbnRob25pYSBzcGljYXRhIiwgIklvbmFjdGlzIGxpbmFyaWlmb2xpdXMiLCAiSnVuY3VzIHRlbnVpcyIsICJUZXVjcml1bSBjYW5hZGVuc2UiLCAiRXVyeWJpYSBtYWNyb3BoeWxsYSIsICJNYWlhbnRoZW11bSBjYW5hZGVuc2UiLCAiVmlvbGEgc29yb3JpYSIsICJCaWRlbnMgZnJvbmRvc2EiLCAiT3hhbGlzIHN0cmljdGEiLCAiUGVyc2ljYXJpYSBwZW5zeWx2YW5pY2EiLCAiVGhhbGljdHJ1bSBkaW9pY3VtIiwgIlRveGljb2RlbmRyb24gcmFkaWNhbnMiLCAiQW1lbGFuY2hpZXIgYXJib3JlYSIsICJBbWVsYW5jaGllciBsYWV2aXMiLCAiQW5hcGhhbGlzIG1hcmdhcml0YWNlYSIsICJBcG9jeW51bSBhbmRyb3NhZW1pZm9saXVtIiwgIkFyYWJpcyBjYW5hZGVuc2lzIiwgIkFzcGxlbml1bSBwbGF0eW5ldXJvbiIsICJBc3BsZW5pdW0gdHJpY2hvbWFuZXMiLCAiQXVyZW9sYXJpYSB2aXJnaW5pY2EiLCAiQmV0dWxhIG5pZ3JhIiwgIkNhcmRhbWluZSBwYXJ2aWZsb3JhIiwgIkNhcmV4IGhpdGNoY29ja2lhbmEiLCAiQ2FyeWEgY29yZGlmb3JtaXMiLCAiQ29ybnVzIHJ1Z29zYSIsICJDeXBlcnVzIGx1cHVsaW51cyIsICJEaWVydmlsbGEgbG9uaWNlcmEiLCAiRGlvc3B5cm9zIHZpcmdpbmlhbmEiLCAiRXJpZ2Vyb24gcGhpbGFkZWxwaGljdXMiLCAiSGVsaWFudGh1cyBkaXZhcmljYXR1cyIsICJKdWdsYW5zIG5pZ3JhIiwgIkxlY2hlYSByYWNlbXVsb3NhIiwgIk1hbHVzIGNvcm9uYXJpYSIsICJPeGFsaXMgdmlvbGFjZWEiLCAiUGh5c2FsaXMgdmlyZ2luaWFuYSIsICJQcmVuYW50aGVzIGFsdGlzc2ltYSIsICJQeWNuYW50aGVtdW0gY2xpbm9wb2Rpb2lkZXMiLCAiUmliZXMgYW1lcmljYW51bSIsICJTZXJpY29jYXJwdXMgbGluaWZvbGl1cyIsICJTb2xpZGFnbyBmbGV4aWNhdWxpcyIsICJTeW1waHlvdHJpY2h1bSBsYW5jZW9sYXR1bSIsICJTeW1waHlvdHJpY2h1bSBsb3dyaWVhbnVtIiwgIlZhY2Npbml1bSBhbmd1c3RpZm9saXVtIiwgIlZlcmJlbmEgc2ltcGxleCIsICJBcXVpbGVnaWEgY2FuYWRlbnNpcyIsICJBcmFsaWEgcmFjZW1vc2EiLCAiQXJpc3RpZGEgbG9uZ2lzcGljYSIsICJCaWRlbnMgY29ubmF0YSIsICJCb2VobWVyaWEgY3lsaW5kcmljYSIsICJDYXJleCBlYnVybmVhIiwgIkNhcmV4IG11ZWhsZW5iZXJnaWkiLCAiQ2xheXRvbmlhIHZpcmdpbmljYSIsICJDb25vcGhvbGlzIGFtZXJpY2FuYSIsICJDeXBlcnVzIG9kb3JhdHVzIiwgIkRlc21vZGl1bSBjYW5hZGVuc2UiLCAiRGljZW50cmEgY3VjdWxsYXJpYSIsICJEaWNoYW50aGVsaXVtIGNsYW5kZXN0aW51bSIsICJFbHltdXMgaHlzdHJpeCIsICJFcnl0aHJvbml1bSBhbWVyaWNhbnVtIiwgIkV1cGF0b3JpdW0gZmlzdHVsb3N1bSIsICJFdXBhdG9yaXVtIGh5c3NvcGlmb2xpdW0iLCAiRXVwYXRvcml1bSBwdXJwdXJldW0iLCAiR2FsaXVtIGxhbmNlb2xhdHVtIiwgIkdlbnRpYW5vcHNpcyBjcmluaXRhIiwgIkxlZXJzaWEgdmlyZ2luaWNhIiwgIkxpbGFlb3BzaXMgY2hpbmVuc2lzIiwgIkx5Y29wdXMgdW5pZmxvcnVzIiwgIkx5c2ltYWNoaWEgaHlicmlkYSIsICJNb25vdHJvcGEgaHlwb3BpdGh5cyIsICJPZW5vdGhlcmEgcGFydmlmbG9yYSIsICJPcHVudGlhIGh1bWlmdXNhIiwgIk9yb2JhbmNoZSB1bmlmbG9yYSIsICJPc211bmRhIHJlZ2FsaXMiLCAiUGFuYXggcXVpbnF1ZWZvbGl1cyIsICJTeW1waHlvdHJpY2h1bSBub3ZhZS1hbmdsaWFlIiwgIlRoZWx5cHRlcmlzIG5vdmVib3JhY2Vuc2lzIiwgIlZpYnVybnVtIGRlbnRhdHVtIiwgIlZpb2xhIHNhZ2l0dGF0YSIsICJCcm9tdXMgcHViZXNjZW5zIiwgIkRlcGFyaWEgYWNyb3N0aWNob2lkZXMiLCAiRmFndXMgZ3JhbmRpZm9saWEiLCAiRnJheGludXMgYW1lcmljYW5hIiwgIkp1Z2xhbnMgY2luZXJlYSIsICJMYXBvcnRlYSBjYW5hZGVuc2lzIiwgIkxpbmRlcmEgYmVuem9pbiIsICJQb2x5Z2FsYSBzYW5ndWluZWEiLCAiUG9seWdvbnVtIGVyZWN0dW0iLCAiUG9wdWx1cyBkZWx0b2lkZXMiLCAiUmFudW5jdWx1cyBwZW5zeWx2YW5pY3VzIiwgIlNhbGl4IGh1bWlsaXMiLCAiU3BpcmFudGhlcyBsYWNlcmEiLCAiVGhhbGljdHJ1bSB0aGFsaWN0cm9pZGVzIiwgIlRyaWNob3Bob3J1bSBwbGFuaWZvbGl1bSIsICJUcmlsbGl1bSBjZXJudXVtIiwgIlVsbXVzIGFtZXJpY2FuYSIsICJWaW9sYSBwZWRhdGEiLCAiQWxldHJpcyBmYXJpbm9zYSIsICJBbmVtb25lIHF1aW5xdWVmb2xpYSIsICJBcmFiaXMgZ2xhYnJhIiwgIkJldHVsYSBsZW50YSIsICJDYXJleCBhbGJpY2FucyIsICJDYXJleCBwbGF0eXBoeWxsYSIsICJDaXJjYWVhIGx1dGV0aWFuYSIsICJDdXBoZWEgdmlzY29zaXNzaW1hIiwgIkRhbnRob25pYSBjb21wcmVzc2EiLCAiRGVzY2hhbXBzaWEgZmxleHVvc2EiLCAiRGVzbW9kaXVtIGNhbmVzY2VucyIsICJEZXNtb2RpdW0gbGFldmlnYXR1bSIsICJEZXNtb2RpdW0gbnV0dGFsbGlpIiwgIkdvb2R5ZXJhIHB1YmVzY2VucyIsICJIaWVyYWNpdW0gZ3Jvbm92aWkiLCAiSnVuY3VzIGFjdW1pbmF0dXMiLCAiSnVuY3VzIG1hcmdpbmF0dXMiLCAiTHljb3BvZGl1bSBkaWdpdGF0dW0iLCAiT3BoaW9nbG9zc3VtIHB1c2lsbHVtIiwgIlBhcmlldGFyaWEgcGVuc3lsdmFuaWNhIiwgIlBsdWNoZWEgb2RvcmF0YSIsICJQb2x5Z2FsYSBpbmNhcm5hdGEiLCAiUG9seWdvbnVtIHJhbW9zaXNzaW11bSIsICJQc2V1ZG9nbmFwaGFsaXVtIG9idHVzaWZvbGl1bSIsICJQeWNuYW50aGVtdW0gdG9ycmVpIiwgIlNhYmF0aWEgZG9kZWNhbmRyYSIsICJTYWxpY29ybmlhIHZpcmdpbmljYSIsICJTb2xpZGFnbyBzcGVjaW9zYSIsICJTcGFydGluYSBjeW5vc3Vyb2lkZXMiLCAiU3BoZW5vcGhvbGlzIG5pdGlkYSIsICJTeW1waHlvdHJpY2h1bSByYWNlbW9zdW0iLCAiVHJpb3N0ZXVtIHBlcmZvbGlhdHVtIiwgIlZlcm9uaWNhc3RydW0gdmlyZ2luaWN1bSIsICJBbmVtb25lIGN5bGluZHJpY2EiLCAiQW50ZW5uYXJpYSBuZWdsZWN0YSIsICJCb3RyeWNoaXVtIHZpcmdpbmlhbnVtIiwgIkNhbHlzdGVnaWEgc3BpdGhhbWFlYSIsICJDZW5jaHJ1cyBsb25naXNwaW51cyIsICJDaGFtYWVjcmlzdGEgZmFzY2ljdWxhdGEiLCAiQ2hhbWFlY3Jpc3RhIG5pY3RpdGFucyIsICJDb21wdG9uaWEgcGVyZWdyaW5hIiwgIkxldWNvdGhvZSByYWNlbW9zYSIsICJMaWF0cmlzIHNjYXJpb3NhIiwgIkx5Y29wb2RpdW0gb2JzY3VydW0iLCAiTHljb3B1cyB2aXJnaW5pY3VzIiwgIkx5c2ltYWNoaWEgY2lsaWF0YSIsICJMeXNpbWFjaGlhIHF1YWRyaWZvbGlhIiwgIk9saWdvbmV1cm9uIHJpZ2lkdW0iLCAiUGFuYXggdHJpZm9saXVzIiwgIlBoYXNlb2x1cyBwb2x5c3RhY2hpb3MiLCAiUG9seWdvbmF0dW0gYmlmbG9ydW0iLCAiU3Bvcm9ib2x1cyBjb21wb3NpdHVzIiwgIlN5bXBoeW90cmljaHVtIGVyaWNvaWRlcyIsICJVdnVsYXJpYSBzZXNzaWxpZm9saWEiLCAiVnVscGlhIG9jdG9mbG9yYSIsICJBZ3JpbW9uaWEgZ3J5cG9zZXBhbGEiLCAiQW1icm9zaWEgdHJpZmlkYSIsICJBc3BsZW5pdW0gcmhpem9waHlsbHVtIiwgIkJhcnRvbmlhIHZpcmdpbmljYSIsICJDYXJ5YSBvdmFsaXMiLCAiQ29yYWxsb3JyaGl6YSBtYWN1bGF0YSIsICJDb3JhbGxvcnJoaXphIG9kb250b3JoaXphIiwgIkNvcnlkYWxpcyBzZW1wZXJ2aXJlbnMiLCAiRGVzbW9kaXVtIG9idHVzdW0iLCAiRXJhZ3Jvc3RpcyBjYXBpbGxhcmlzIiwgIk9ub2NsZWEgc2Vuc2liaWxpcyIsICJPc211bmRhIGNsYXl0b25pYW5hIiwgIlB0ZWxlYSB0cmlmb2xpYXRhIiwgIlJ1YnVzIG9kb3JhdHVzIiwgIlNhbGl4IHNlcmljZWEiLCAiU2Nyb3BodWxhcmlhIGxhbmNlb2xhdGEiLCAiU2Nyb3BodWxhcmlhIG1hcmlsYW5kaWNhIiwgIlRoYXNwaXVtIHRyaWZvbGlhdHVtIiwgIldvb2RzaWEgb2J0dXNhIiwgIkFnYXN0YWNoZSBuZXBldG9pZGVzIiwgIkFzY2xlcGlhcyB2ZXJ0aWNpbGxhdGEiLCAiQnJvbXVzIGNpbGlhdHVzIiwgIkNhcmRhbWluZSBkaXBoeWxsYSIsICJDcmF0YWVndXMgcGVkaWNlbGxhdGEiLCAiRWx5bXVzIGNhbmFkZW5zaXMiLCAiR2FsZWFyaXMgc3BlY3RhYmlsaXMiLCAiUGVsbGFlYSBhdHJvcHVycHVyZWEiLCAiUHJ1bnVzIHBlbnN5bHZhbmljYSIsICJUc3VnYSBjYW5hZGVuc2lzIiwgIlVsbXVzIHJ1YnJhIiwgIkFjZXIgc2FjY2hhcmludW0iLCAiQWNlciBzYWNjaGFydW0iLCAiQW5kcm9wb2dvbiBnbG9tZXJhdHVzIiwgIkFuZHJvcG9nb24gdmlyZ2luaWN1cyIsICJDYXJ5YSBvdmF0YSIsICJDaGVub3BvZGl1bSBzaW1wbGV4IiwgIkNvbGxpbnNvbmlhIGNhbmFkZW5zaXMiLCAiQ3JhdGFlZ3VzIGNydXMtZ2FsbGkiLCAiQ3lzdG9wdGVyaXMgZnJhZ2lsaXMiLCAiRGljaGFudGhlbGl1bSBzY29wYXJpdW0iLCAiRGlvc2NvcmVhIHZpbGxvc2EiLCAiRWx5bXVzIHZpcmdpbmljdXMiLCAiR2F5bHVzc2FjaWEgZnJvbmRvc2EiLCAiSGVsaWFudGh1cyBkZWNhcGV0YWx1cyIsICJIaWVyb2NobG9lIG9kb3JhdGEiLCAiSHlkcm9waHlsbHVtIGNhbmFkZW5zZSIsICJMYXRoeXJ1cyBwYWx1c3RyaXMiLCAiTGlsaXVtIHBoaWxhZGVscGhpY3VtIiwgIkxpcGFyaXMgbGlsaWlmb2xpYSIsICJMeW9uaWEgbWFyaWFuYSIsICJMeXNpbWFjaGlhIHRoeXJzaWZsb3JhIiwgIk1lZGVvbGEgdmlyZ2luaWFuYSIsICJPc3RyeWEgdmlyZ2luaWFuYSIsICJPeGFsaXMgbW9udGFuYSIsICJQb2RvcGh5bGx1bSBwZWx0YXR1bSIsICJQb3B1bHVzIGdyYW5kaWRlbnRhdGEiLCAiUHljbmFudGhlbXVtIGluY2FudW0iLCAiUHljbmFudGhlbXVtIG11dGljdW0iLCAiUXVlcmN1cyBwcmlub2lkZXMiLCAiUXVlcmN1cyBzdGVsbGF0YSIsICJTYWJhdGlhIGNhbXBhbnVsYXRhIiwgIlNhbHZpYSBseXJhdGEiLCAiU2FuZ3VpbmFyaWEgY2FuYWRlbnNpcyIsICJTaWN5b3MgYW5ndWxhdHVzIiwgIlNpbGVuZSBhbnRpcnJoaW5hIiwgIlNtaWxheCBoZXJiYWNlYSIsICJTeW1waHlvdHJpY2h1bSBjb3JkaWZvbGl1bSIsICJTeW1waHlvdHJpY2h1bSBub3ZpLWJlbGdpaSIsICJUaWxpYSBhbWVyaWNhbmEiLCAiVHJpbGxpdW0gZXJlY3R1bSIsICJVdnVsYXJpYSBwZXJmb2xpYXRhIiwgIlZpYnVybnVtIGxhbnRhbm9pZGVzIiwgIkFnYWxpbmlzIHB1cnB1cmVhIiwgIkFsaXNtYSB0cml2aWFsZSIsICJCb3RyeWNoaXVtIGRpc3NlY3R1bSIsICJDYXJkYW1pbmUgY29uY2F0ZW5hdGEiLCAiQ2lubmEgYXJ1bmRpbmFjZWEiLCAiQ29tbWVsaW5hIGVyZWN0YSIsICJDcm90YWxhcmlhIHNhZ2l0dGFsaXMiLCAiRWNoaW5vY3lzdGlzIGxvYmF0YSIsICJFcGlmYWd1cyB2aXJnaW5pYW5hIiwgIkV1dGhhbWlhIHRlbnVpZm9saWEiLCAiRnJheGludXMgcGVubnN5bHZhbmljYSIsICJHYXVsdGhlcmlhIHByb2N1bWJlbnMiLCAiR2VudGlhbmEgYW5kcmV3c2lpIiwgIkxvbmljZXJhIGRpb2ljYSIsICJNYXR0ZXVjY2lhIHN0cnV0aGlvcHRlcmlzIiwgIk1vbm90cm9wYSB1bmlmbG9yYSIsICJPY2xlbWVuYSBhY3VtaW5hdGEiLCAiT25vc21vZGl1bSB2aXJnaW5pYW51bSIsICJQaGVnb3B0ZXJpcyBjb25uZWN0aWxpcyIsICJQb2x5Z29uYXR1bSBwdWJlc2NlbnMiLCAiUG9seWdvbnVtIHRlbnVlIiwgIlJ1YnVzIGN1bmVpZm9saXVzIiwgIlNtaWxheCBnbGF1Y2EiLCAiU3RhcGh5bGVhIHRyaWZvbGlhIiwgIldvb2R3YXJkaWEgdmlyZ2luaWNhIiwgIkNhdWxvcGh5bGx1bSB0aGFsaWN0cm9pZGVzIiwgIkNoYW1hZWxpcml1bSBsdXRldW0iLCAiQ3JhdGFlZ3VzIHBydWlub3NhIiwgIkN5cGVydXMgc3F1YXJyb3N1cyIsICJEcnlvcHRlcmlzIGNhcnRodXNpYW5hIiwgIkV1b255bXVzIGFtZXJpY2FuYSIsICJHYWxhY3RpYSB2b2x1YmlsaXMiLCAiTGlwYXJpcyBsb2VzZWxpaSIsICJNZW5pc3Blcm11bSBjYW5hZGVuc2UiLCAiUG9seXBvZGl1bSB2aXJnaW5pYW51bSIsICJTY2xlcmlhIHRyaWdsb21lcmF0YSIsICJTY3V0ZWxsYXJpYSBlbGxpcHRpY2EiLCAiU3RhY2h5cyB0ZW51aWZvbGlhIiwgIldvb2RzaWEgaWx2ZW5zaXMiKQoKYGBgCgoKCg==